Региональные настройки и как с ними бороться?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Региональные настройки и как с ними бороться?

Сообщение Flo » 30.04.2004 (Пт) 11:43

У меня такой вопрос - как сделать работу программы независимой от региональных настроек?
Поясню - я живу в Эстонии. По большому счету, пользователь может иметь на своем компе в кач-ве региональной настройки:
Эстонию, Россию, а если ему все до лампочки, то какую-нибудь еще.
У них у всех разные форматы даты, десятичных разделителей и т.п.
В программе я преобразую текст вида ###.## в число и если десятичный разделитель региональной настройки не ".", а к примеру ",", то все виснет. :evil:
Отказываются работать ф-ии CSng, CVar, может еще какие-то, но эти - точно!
Что можно вообще с этим делать??? :?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 30.04.2004 (Пт) 12:11

Ну есть же API, которое эти настройки возвращает.

Почитай к примеру Platform SDK: International Features

National Language Support Functions в MSDN.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.04.2004 (Пт) 12:34

Заменяй свою точку на значение, которое вернет функция:

Код: Выделить всё

Public Function DOT() As String
    DOT = VBA.Mid$(0.25, 2, 1)
End Function

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 30.04.2004 (Пт) 13:38

Спасибо! Но..

2RayShade:
Мне, правда, очень стыдно, но это мой второй с половиной проект и при буквосочетании API мне становится, как бы это сказать, плоховато.. :shock: :oops: Я почитала все, но как-то чтоб поумнеть - не очень :? Как бы чуть-чуть поразвернутее, а?

Я кажется, даже нашла эту самую API - GetNumberFormat. Про нее написано "formats a number string as a number string customized for a specified locale"
Но та ли это и что с ней теперь делать? :(

2Konst_One:
Увы, но эта комбинация возвращает у меня не то, что нужно. Я точно знаю, что сейчас у меня разделитель "." (программа потому что работает), а она возвращает "," и в аут!
Последний раз редактировалось Flo 30.04.2004 (Пт) 13:56, всего редактировалось 1 раз.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.04.2004 (Пт) 13:47

если тебе функция DOT возвращает "," то тогда нужно значения с разделителями в запросы перадавать в таком виде "1234,45" а не в таком "1234.45"

и тогда у тебя будут функции работать vba.CSng("1234,45") , что можно легко проверить в окне Immediate в VB

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2004 (Пт) 14:16

Код: Выделить всё
Public Enum LocaleInfoConstants
  liICentury = &H24                '  century format specifier
  liICountry = &H5                 '  country code
  liICurrDigits = &H19             '  # local monetary digits
  liICurrency = &H1B               '  positive currency mode
  liIDate = &H21                   '  short date format ordering
  liIDayLZero = &H26               '  leading zeros in day field
  liIDefaultCodePage = &HB         '  default code page
  liIDefaultCountry = &HA          '  default country code
  liIDefaultLanguage = &H9         '  default language id
  liIDigits = &H11                 '  number of fractional digits
  liIIntlCurrDigits = &H1A         '  # intl monetary digits
  liILanguage = &H1                '  language id
  liILDate = &H22                  '  long date format ordering
  liILZero = &H12                  '  leading zeros for decimal
  liIMeasure = &HD                 '  0 = metric, 1 = US
  liIMonLZero = &H27               '  leading zeros in month field
  liINegCurr = &H1C                '  negative currency mode
  liINegSepBySpace = &H57          '  mon sym sep by space from neg amt
  liINegSignPosN = &H53            '  negative sign position
  liINegSymPrecedes = &H56         '  mon sym precedes neg amt
  liIPosSepBySpace = &H55          '  mon sym sep by space from pos amt
  liIPosSignPosN = &H52            '  positive sign position
  liIPosSymPrecedes = &H54         '  mon sym precedes pos amt
  liITime = &H23                   '  time format specifier
  liITLZero = &H25                 '  leading zeros in time field
  liNoUserOverride = &H80000000    '  do not use user overrides
  liS1159 = &H28                   '  AM designator
  liS2359 = &H29                   '  PM designator
  liSAbbrevCtryName = &H7          '  abbreviated country name
  liSAbbrevDayName1 = &H31         '  abbreviated name for Monday
  liSAbbrevDayName2 = &H32         '  abbreviated name for Tuesday
  liSAbbrevDayName3 = &H33         '  abbreviated name for Wednesday
  liSAbbrevDayName4 = &H34         '  abbreviated name for Thursday
  liSAbbrevDayName5 = &H35         '  abbreviated name for Friday
  liSAbbrevDayName6 = &H36         '  abbreviated name for Saturday
  liSAbbrevDayName7 = &H37         '  abbreviated name for Sunday
  liSAbbrevLangName = &H3          '  abbreviated language name
  liSAbbrevMonthName1 = &H44       '  abbreviated name for January
  liSAbbrevMonthName2 = &H45       '  abbreviated name for February
  liSAbbrevMonthName3 = &H46       '  abbreviated name for March
  liSAbbrevMonthName4 = &H47       '  abbreviated name for April
  liSAbbrevMonthName5 = &H48       '  abbreviated name for May
  liSAbbrevMonthName6 = &H49       '  abbreviated name for June
  liSAbbrevMonthName7 = &H4A       '  abbreviated name for July
  liSAbbrevMonthName8 = &H4B       '  abbreviated name for August
  liSAbbrevMonthName9 = &H4C       '  abbreviated name for September
  liSAbbrevMonthName10 = &H4D      '  abbreviated name for October
  liSAbbrevMonthName11 = &H4E      '  abbreviated name for November
  liSAbbrevMonthName12 = &H4F      '  abbreviated name for December
  liSAbbrevMonthName13 = &H100F
  liSCountry = &H6                 '  localized name of country
  liSCurrency = &H14               '  local monetary symbol
  liSDate = &H1D                   '  date separator
  liSDayName1 = &H2A               '  long name for Monday
  liSDayName2 = &H2B               '  long name for Tuesday
  liSDayName3 = &H2C               '  long name for Wednesday
  liSDayName4 = &H2D               '  long name for Thursday
  liSDayName5 = &H2E               '  long name for Friday
  liSDayName6 = &H2F               '  long name for Saturday
  liSDayName7 = &H30               '  long name for Sunday
  liSDecimal = &HE                 '  decimal separator
  liSEngCountry = &H1002           '  English name of country
  liSEngLanguage = &H1001          '  English name of language
  liSGrouping = &H10               '  digit grouping
  liSIntlSymbol = &H15             '  intl monetary symbol
  liSLanguage = &H2                '  localized name of language
  liSList = &HC                    '  list item separator
  liSLongDate = &H20               '  long date format string
  liSMonDecimalSep = &H16          '  monetary decimal separator
  liSMonGrouping = &H18            '  monetary grouping
  liSMonthName1 = &H38             '  long name for January
  liSMonthName2 = &H39             '  long name for February
  liSMonthName3 = &H3A             '  long name for March
  liSMonthName4 = &H3B             '  long name for April
  liSMonthName5 = &H3C             '  long name for May
  liSMonthName6 = &H3D             '  long name for June
  liSMonthName7 = &H3E             '  long name for July
  liSMonthName8 = &H3F             '  long name for August
  liSMonthName9 = &H40             '  long name for September
  liSMonthName10 = &H41            '  long name for October
  liSMonthName11 = &H42            '  long name for November
  liSMonthName12 = &H43            '  long name for December
  liSMonThousandSep = &H17         '  monetary thousand separator
  liSNativeCtryName = &H8          '  native name of country
  liSNativeDigits = &H13           '  native ascii 0-9
  liSNativeLangName = &H4          '  native name of language
  liSNegativeSign = &H51           '  negative sign
  liSPositiveSign = &H50           '  positive sign
  liSShortDate = &H1F              '  short date format string
  liSThousand = &HF                '  thousand separator
  liSTime = &H1E                   '  time separator
  liSTimeFormat = &H1003           '  time format string
End Enum
Private Declare Function GetLocaleInfo Lib "kernel32" _
  Alias "GetLocaleInfoA" ( _
   ByVal Locale As Long, _
   ByVal LCType As LocaleInfoConstants, _
   ByVal lpLCData As String, _
   ByVal cchData As Long) _
  As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long

Public Function LocaleInfo(ByVal LocaleType As LocaleInfoConstants, Optional ByVal UserLocale As Boolean = True) As String
Dim L As Long, B As String * 1024, BL As Long
If UserLocale Then
  L = GetUserDefaultLCID()
Else
  L = GetSystemDefaultLCID()
End If
BL = GetLocaleInfo(L, LocaleType, B, Len(B))
LocaleInfo = Left$(B, BL - 1)
End Function


?LocaleInfo(liSDecimal)
Lasciate ogni speranza, voi ch'entrate.

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 30.04.2004 (Пт) 14:41

2Konst_One:

Возможно, я не совсем вас понимаю, поэтому хочу уточнить - что означает приставка vba. у ваших функций и о каких запросах вы говорите?
Я считываю из текстового файла строку "123.35" и хочу присвоить это значение полю Single. Для этого я делаю .Fields(7) = CSng(MyStr) . Если я воспользуюсь предложенным вами способом, то получу на этой строке ошибку Type mismatch (Error 13). :shock:

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 30.04.2004 (Пт) 14:44

2 alibek
:shock: А не подскажете, что с этим делать? По поводу своей дремучести я уже извинялась... :oops: :oops:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2004 (Пт) 14:49

Я же написал. К примеру, LocaleInfo(liSDecimal) возвращает текущий (для пользователя) разделитель целой и дробной части. Другие константы возвращают другие значения (в Enum'ах указаны краткие комментарии).
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.04.2004 (Пт) 15:05

Код: Выделить всё
MyStr="1234.25"
MyStr=VBA.Replace(MyStr,".",DOT)
.Fields(7) = CSng(MyStr)


вуаля

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.04.2004 (Пт) 15:07

alibek предложил это делать через API, тоже будет работать, да к тому же там можно любую региональную настройку вытащить, в зависимости, что тебе надо

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 30.04.2004 (Пт) 15:25

Большому Человеку Бо-о-о-ольшое-пребольшое спасибо!!! :P

Хочу продолжить эту тему. Ведь Кроме России и Эстонии существует еще к примеру Англия, где проклятые буржуины придумали ставить запятые в середине чисел, то бишь 123,236.000. А может еще кто что придумал. Так может есть какая-нибудь волшебная API, которая сама (надежда умирает последней) приведет строку в нужный для преобразования вид. Или это все ручками надо? :wink:

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 30.04.2004 (Пт) 15:28

Konst_One, спасибо большое!! :P

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2004 (Пт) 16:05

Для разделителей групп используется константа liSThousand.
Смотри по комментариям, там почти все виды настроек есть, вплоть до того, как представлены числительные в данной системе (в виде строки).
Lasciate ogni speranza, voi ch'entrate.

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 30.04.2004 (Пт) 16:18

А, значит все-таки ручками надо реагировать, само ничего не случается. НУ и пусть, допишу и это. :D

Большое, большое спасибо всем продвинутым посетителям этого здоровского форума!
Не даете пропасть дремучим новичкам вроде меня. :roll:

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 30.04.2004 (Пт) 17:59

Зрассьте, это снова я. :(
С числами разобралась, с этой милой API более-менее тоже.
Теперь вопрос с датой. Я получаю строку даты "дд.мм.гггг"
Из API я могу получить формат текущей системной даты, разделитель даты (много чего). Но вопрос в том, как мне преобразовать мою дату в нужный мне вид? Format не понимает, что это дата, а других подобных функций я не знаю :roll: :oops:
Чем это сделать с датой и временем? Помогите, пожалуйста!!! :cry:

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 01.05.2004 (Сб) 3:04

Flo писал(а):Большому Человеку Бо-о-о-ольшое-пребольшое спасибо!!! :P

Хочу продолжить эту тему. Ведь Кроме России и Эстонии существует еще к примеру Англия, где проклятые буржуины придумали ставить запятые в середине чисел, то бишь 123,236.000. А может еще кто что придумал. Так может есть какая-нибудь волшебная API, которая сама (надежда умирает последней) приведет строку в нужный для преобразования вид. Или это все ручками надо? :wink:


Как могучему программеру, скажу тебе, если они всетаки так придумали, пусть сразу указывают формат. Если не хочешь писать программу обработки по маске(борода там длинная и седая получается, надо же и на ошибки проверить), заставь зверей делать по-чсвоему и скажи "это такая мелоч, не стоит на этом зацикливаться" во всяком случае им же будет выгоднее корректная работа программы ... Вали на юзверей всё, а то "Мы хотим так, хотим так... " или пусть доплачивают за доработку:) ...
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 03.05.2004 (Пн) 16:46

Эх, спасибо на добром слове - могучим программером назвали, я аж загоржусь :lol:
Если б я им была, все бы было здорово и может права качала бы. Но мне до него еще у-у-у.
А кроме юзверей, у меня есть еще и шеф, который считает, что программа должна работать в любых условиях, и в принципе, я с ним даже согласна, но мне, как говорится от этого не легче..
А обработку я уже, кажись, написала, хоть и борода, как справедливо замечено, ого-го. 8)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 03.05.2004 (Пн) 20:47

Но всего учесть нельзя ... ты всеравно когда програму пишешь ориентируешься на кого-то ...
Так вместе с языковыми настройками просто вставляешь соответствующий модуль обработки данных в программу.

Соответственно выход.
Перебрать все форматыи вставить в программу. Но всего предусмотреть нельзя ... На китайцев и японцев ещё подумай ... опять же ... всё зависит от области распространения.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: PetalBot и гости: 1

    TopList