Tweet
|
If you write a program for dealing with number, money, date, .etc.,
you also need to care about culture specific expressions such as
decimal point, word separator, currency symbol, .etc.
You cannot hardcode these information as strings, instead,
getting these information from each platform API is better solution.
The following codes is a sample of using Windows API "GetLocaleInfo" in
Visual Basic codes, to indicate decimal point corresponding to region and
language setting of system.
Option Explicit Private Declare Function GetLocaleInfo Lib "kernel32" _ Alias "GetLocaleInfoA" (ByVal Locale As Long, _ ByVal LCType As Long, ByVal lpLCData As String, _ ByVal cchData As Long) As Long Private Declare Function GetUserDefaultLCID% Lib "kernel32" () Private Const LOCALE_SCURRENCY = &H14 Dim Symbol As String Dim iRet1 As Long Dim iRet2 As Long Dim lpLCDataVar As String Dim Pos As Integer Dim Locale as Long Locale = GetUserDefaultLCID() iRet1 = GetLocaleInfo(Locale, LOCALE_SCURRENCY, lpLCDataVar, 0) Symbol = String$(iRet1, 0) iRet2 = GetLocaleInfo(Locale, LOCALE_SCURRENCY, Symbol, iRet1) Pos = InStr(Symbol, Chr$(0)) If Pos > 0 Then Symbol = Left$(Symbol, Pos - 1) End If
You can also set these info to the current locale by Windows API "SetLocaleInfo".
BOOL SetLocaleInfo( LCID Locale, LCTYPE LCType, LPCTSTR lpLCData );
Constant Description LOCALE_ILANGUAGE Language identifier indicating the language. The maximum number of characters allowed for this string is 5. LOCALE_SLANGUAGE Full localized name of the language. LOCALE_SENGLANGUAGE Full English name of the language from the International Organization for Standardization (ISO) Standard 639. This is always restricted to characters mappable into the ASCII 127-character subset. LOCALE_SABBREVLANGNAME Abbreviated name of the language, created by taking the 2-letter language abbreviation from the ISO Standard 639 and adding a third letter, as appropriate, to indicate the sublanguage. LOCALE_SNATIVELANGNAME Native name of the language. LOCALE_ICOUNTRY Country code, based on international phone codes, also referred to as IBM country codes. The maximum number of characters allowed for this string is 6. LOCALE_SCOUNTRY Full localized name of the country. LOCALE_SENGCOUNTRY Full English name of the country. This is always restricted to characters mappable into the ASCII 127-character subset. LOCALE_SABBREVCTRYNAME Abbreviated name of the country from the ISO Standard 3166. LOCALE_SNATIVECTRYNAME Native name of the country. LOCALE_IDEFAULTLANGUAGE Language identifier for the principal language spoken in this locale. This is provided so that partially specified locales can be completed with default values. The maximum number of characters allowed for this string is 5. LOCALE_IDEFAULTCOUNTRY Country code for the principal country in this locale. This is provided so that partially specified locales can be completed with default values. The maximum number of characters allowed for this string is 6. LOCALE_IDEFAULTCODEPAGE Original equipment manufacturer (OEM) code page associated with the country. The maximum number of characters allowed for this string is 6. LOCALE_SLIST Character(s) used to separate list items. For example, a comma is used in many locales. LOCALE_IMEASURE System of measurement. This value is 0 if the metric system (Systéme International d'Unités, or S.I.) is used and 1 if the U.S. system is used. The maximum number of characters allowed for this string is 2. LOCALE_SDECIMAL Character(s) used as the decimal separator. LOCALE_STHOUSAND Character(s) used to separate groups of digits to the left of the decimal. LOCALE_SGROUPING Sizes for each group of digits to the left of the decimal. An explicit size is needed for each group; sizes are separated by semicolons. If the last value is zero, the preceding value is repeated. To group thousands, specify 3;0, for example. LOCALE_IDIGITS Number of fractional digits. The maximum number of characters allowed for this string is 3. LOCALE_ILZERO Specifier for leading zeros in decimal fields. The maximum number of characters allowed for this string is 2. The specifier can be one of the following values: 0 = No leading zeros, 1 = Leading zeros LOCALE_SNATIVEDIGITS Native equivalents to ASCII 0 through 9. LOCALE_SCURRENCY String used as the local monetary symbol. LOCALE_SINTLSYMBOL Three characters of the international monetary symbol specified in ISO 4217, "Codes for the Representation of Currencies and Funds," followed by the character separating this string from the amount. LOCALE_SMONDECIMALSEP Character(s) used as the monetary decimal separator. LOCALE_SMONTHOUSANDSEP Character(s) used as the monetary separator between groups of digits to the left of the decimal. LOCALE_SMONGROUPING Sizes for each group of monetary digits to the left of the decimal. An explicit size is needed for each group; sizes are separated by semicolons. If the last value is zero, the preceding value is repeated. To group thousands, specify 3;0, for example. LOCALE_ICURRDIGITS Number of fractional digits for the local monetary format. The maximum number of characters allowed for this string is 3. LOCALE_IINTLCURRDIGITS Number of fractional digits for the international monetary format. The maximum number of characters allowed for this string is 3. LOCALE_ICURRENCY Positive currency mode. The maximum number of characters allowed for this string is 2. The mode can be one of the following values: 0 = Prefix, no separation, 1 = Suffix, no separation, 2 = Prefix, 1-char. separation, 3 = Suffix, 1-char. separation LOCALE_INEGCURR Negative currency mode. The maximum number of characters allowed for this string is 3. The mode can be one of the following values (right side is an example): 0 = ($1.1), 1 = -$1.1, 2 = $-1.1, 3 = $1.1-, 4 = (1.1$), 5 = -1.1$, 6 = 1.1-$, 7 = 1.1$-, 8 = -1.1 $ (space before $), 9 = -$ 1.1 (space after $), 10 = 1.1 $- (space before $), 11 = $ 1.1- (space after $), 12 = $ -1.1 (space after $), 13 = 1.1- $ (space before $), 14 = ($ 1.1) (space after $), 15 = (1.1 $) (space before $) LOCALE_SDATE Character(s) for the date separator. LOCALE_STIME Character(s) for the time separator. LOCALE_STIMEFORMAT Time formatting strings for this locale. LOCALE_SSHORTDATE Short date formatting string for this locale. LOCALE_SLONGDATE Long date formatting string for this locale. LOCALE_IDATE Short date format-ordering specifier. The maximum number of characters allowed for this string is 2. The specifier can be one of the following values: 0 = Month-Day-Year, 1 = Day-Month-Year, 2 = Year-Month-Day LOCALE_ILDATE Long date format-ordering specifier. The maximum number of characters allowed for this string is 2. The specifier can be one of the following values: 0 = Month-Day-Year, 1 = Day-Month-Year, 2 = Year-Month-Day LOCALE_ITIME Time format specifier. The maximum number of characters allowed for this string is 2. The specifier can be one of the following values: 0 = AM / PM 12-hour format, 1 = 24-hour format LOCALE_ICENTURY Specifier for full 4-digit century. The maximum number of characters allowed for this string is 2. The specifier can be one of the following values: 0 = Abbreviated 2-digit century, 1 = Full 4-digit century LOCALE_ITLZERO Specifier for leading zeros in time fields. The maximum number of characters allowed for this string is 2. The specifier can be one of the following values: 0 = No leading zeros for hours, 1 = Leading zeros for hours LOCALE_IDAYLZERO Specifier for leading zeros in day fields. The maximum number of characters allowed for this string is 2. The specifier can be one of the following values: 0 = No leading zeros for days, 1 = Leading zeros for days LOCALE_IMONLZERO Specifier for leading zeros in month fields. The maximum number of characters allowed for this string is 2. The specifier can be one of the following values: 0 = No leading zeros for months, 1 = Leading zeros for months LOCALE_S1159 String for the AM designator. LOCALE_S2359 String for the PM designator. LOCALE_SDAYNAME1 Native long name for Monday. LOCALE_SDAYNAME2 Native long name for Tuesday. LOCALE_SDAYNAME3 Native long name for Wednesday. LOCALE_SDAYNAME4 Native long name for Thursday. LOCALE_SDAYNAME5 Native long name for Friday. LOCALE_SDAYNAME6 Native long name for Saturday. LOCALE_SDAYNAME7 Native long name for Sunday. LOCALE_SABBREVDAYNAME1 Native abbreviated name for Monday. LOCALE_SABBREVDAYNAME2 Native abbreviated name for Tuesday. LOCALE_SABBREVDAYNAME3 Native abbreviated name for Wednesday. LOCALE_SABBREVDAYNAME4 Native abbreviated name for Thursday. LOCALE_SABBREVDAYNAME5 Native abbreviated name for Friday. LOCALE_SABBREVDAYNAME6 Native abbreviated name for Saturday. LOCALE_SABBREVDAYNAME7 Native abbreviated name for Sunday. LOCALE_SMONTHNAME1 Native long name for January. LOCALE_SMONTHNAME2 Native long name for February. LOCALE_SMONTHNAME3 Native long name for March. LOCALE_SMONTHNAME4 Native long name for April. LOCALE_SMONTHNAME5 Native long name for May. LOCALE_SMONTHNAME6 Native long name for June. LOCALE_SMONTHNAME7 Native long name for July. LOCALE_SMONTHNAME8 Native long name for August. LOCALE_SMONTHNAME9 Native long name for September. LOCALE_SMONTHNAME10 Native long name for October. LOCALE_SMONTHNAME11 Native long name for November. LOCALE_SMONTHNAME12 Native long name for December. LOCALE_SABBREVMONTHNAME1 Native abbreviated name for January. LOCALE_SABBREVMONTHNAME2 Native abbreviated name for February. LOCALE_SABBREVMONTHNAME3 Native abbreviated name for March. LOCALE_SABBREVMONTHNAME4 Native abbreviated name for April. LOCALE_SABBREVMONTHNAME5 Native abbreviated name for May. LOCALE_SABBREVMONTHNAME6 Native abbreviated name for June. LOCALE_SABBREVMONTHNAME7 Native abbreviated name for July. LOCALE_SABBREVMONTHNAME8 Native abbreviated name for August. LOCALE_SABBREVMONTHNAME9 Native abbreviated name for September. LOCALE_SABBREVMONTHNAME10 Native abbreviated name for October. LOCALE_SABBREVMONTHNAME11 Native abbreviated name for November. LOCALE_SABBREVMONTHNAME12 Native abbreviated name for December. LOCALE_SPOSITIVESIGN String value for the positive sign. LOCALE_SNEGATIVESIGN String value for the negative sign. LOCALE_IPOSSIGNPOSN Formatting index for positive values. The maximum number of characters allowed for this string is 2. The index can be one of the following values: 0 = Parentheses surround the amount and the monetary symbol, 1 = The sign string precedes the amount and the monetary symbol, 2 = The sign string succeeds the amount and the monetary symbol, 3 = The sign string immediately precedes the monetary symbol, 4 = The sign string immediately succeeds the monetary symbol. LOCALE_INEGSIGNPOSN Formatting index for negative values. This index uses the same values as LOCALE_IPOSSIGNPOSN. The maximum number of characters allowed for this string is 2. LOCALE_IPOSSYMPRECEDES Position of monetary symbol in a positive monetary value. This value is 1 if the monetary symbol precedes the positive amount, 0 if it follows it. The maximum number of characters allowed for this string is 2. LOCALE_IPOSSEPBYSPACE Separation of monetary symbol in a positive monetary value. This value is 1 if the monetary symbol is separated by a space from a positive amount, 0 if it is not. The maximum number of characters allowed for this string is 2. LOCALE_INEGSYMPRECEDES Position of monetary symbol in a negative monetary value. This value is 1 if the monetary symbol precedes the negative amount, 0 if it follows it. The maximum number of characters allowed for this string is 2. LOCALE_INEGSEPBYSPACE Separation of monetary symbol in a negative monetary value. This value is 1 if the monetary symbol is separated by a space from the negative amount, 0 if it is not. The maximum number of characters allowed for this string is 2. LOCALE_NOUSEROVERRIDE This constant may be OR'ed with any other LCTYPE constant in a call to the GetLocaleInfo function. This always causes the function to bypass any user overrides, and return the system default value for the other LCTYPE specified in the function call, based on the given LCID.
Go to Internationalization Programming Top