Tweet
|
数やお金、日付などを扱うプログラムを書く際、同時に小数点や単語区切り、通貨記号などの文化固有の表現についても気を付ける必要があります。
これらの情報を文字列としてハードコードすることはできません。かわりにこれらの情報を各プラットフォームのAPIによって取得するすることがよい解決策と言えます。
次のコードはWindows APIの"GetLocaleInfo"をVisual Basicのコードで使っているサンプルであり、
システムの地域と言語の設定に合った小数点を示しています。
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
またこれらの情報はWindows APIの"SetLocaleInfo"で現在のロケールに設定することができます。
BOOL SetLocaleInfo( LCID Locale, LCTYPE LCType, LPCTSTR lpLCData );
LOCALE_ILANGUAGE , &H1 , 言語ID LOCALE_SLANGUAGE , &H2 , 言語名 LOCALE_SENGLANGUAGE , &H1001 , 言語英語名 LOCALE_SABBREVLANGNAME , &H3 , 言語省略名 LOCALE_SNATIVELANGNAME , &H4 , 言語固有名 LOCALE_ICOUNTRY , &H5 , 国コード LOCALE_SCOUNTRY , &H6 , 国名 LOCALE_SENGCOUNTRY , &H1002 , 国英語名 LOCALE_SABBREVCTRYNAME , &H7 , 国省略名 LOCALE_SNATIVECTRYNAME , &H8 , 国固有名 LOCALE_IDEFAULTLANGUAGE , &H9 , デフォルト言語ID LOCALE_IDEFAULTCOUNTRY , &HA , デフォルト国コード LOCALE_IDEFAULTCODEPAGE , &HB , デフォルトOEMコードページ LOCALE_IDEFAULTANSICODEPAGE , &H1004 , デフォルトANSIコードページ LOCALE_IDEFAULTMACCODEPAGE , &H1011 , デフォルトMACコードページ LOCALE_FONTSIGNATURE , &H58 , フォント署名 LOCALE_SISO639LANGNAME , &H59 , ISO言語省略名 LOCALE_SISO3166CTRYNAME , &H5A , ISO国省略名 LOCALE_SLIST , &HC , 区切り記号 LOCALE_IMEASURE , &HD , 単位 LOCALE_SDECIMAL , &HE , 小数点の記号 LOCALE_STHOUSAND , &HF , 桁区切り記号 LOCALE_SGROUPING , &H10 , 区切る桁数 LOCALE_IDIGITS , &H11 , 小数点以下の桁数 LOCALE_ILZERO , &H12 , 少数前ゼロの桁数 LOCALE_INEGNUMBER , &H1010 , 負の値の形式 LOCALE_SNATIVEDIGITS , &H13 , 0から9の表記 LOCALE_SPOSITIVESIGN , &H50 , 正の記号 LOCALE_SNEGATIVESIGN , &H51 , 負の記号 LOCALE_IPOSSIGNPOSN , &H52 , 正の記号の位置 LOCALE_INEGSIGNPOSN , &H53 , 負の記号の位置 LOCALE_SCURRENCY , &H14 , 通貨記号 LOCALE_SINTLSYMBOL , &H15 , 国際通貨記号 LOCALE_SMONDECIMALSEP , &H16 , 小数点の記号 LOCALE_SMONTHOUSANDSEP , &H17 , 桁区切り記号 LOCALE_SMONGROUPING , &H18 , 区切る桁数 LOCALE_ICURRDIGITS , &H19 , 小数点以下の桁数 LOCALE_IINTLCURRDIGITS , &H1A , 小数点以下の桁数 LOCALE_ICURRENCY , &H1B , 正の値の形式 LOCALE_INEGCURR , &H1C , 負の値の形式 LOCALE_IPOSSYMPRECEDES , &H54 , 正の通貨記号の位置 LOCALE_IPOSSEPBYSPACE , &H55 , 正の通貨記号の分離位置 LOCALE_INEGSYMPRECEDES , &H56 , 負の通貨記号の位置 LOCALE_INEGSEPBYSPACE , &H57 , 負の通貨記号の分離位置 LOCALE_SDATE , &H1D , 区切り記号 LOCALE_SSHORTDATE , &H1F , 短い形式 LOCALE_SLONGDATE , &H20 , 長い形式 LOCALE_IDATE , &H21 , 短い形式の年月日順 LOCALE_ILDATE , &H22 , 長い形式の年月日順 LOCALE_ICENTURY , &H24 , 年の桁数 LOCALE_IDAYLZERO , &H26 , 日前ゼロの有無 LOCALE_IMONLZERO , &H27 , 月前ゼロの有無 LOCALE_ICALENDARType , &H1009 , カレンダの種類 LOCALE_IOPTIONALCALENDAR , &H100B , 追加カレンダの種類 LOCALE_IFIRSTDAYOFWEEK , &H100C , 週の先頭日 LOCALE_IFIRSTWEEKOFYEAR , &H100D , 年の先頭月 LOCALE_SDAYNAME1 , &H2A , 週の第1日名 LOCALE_SDAYNAME2 , &H2B , 週の第2日名 LOCALE_SDAYNAME3 , &H2C , 週の第3日名 LOCALE_SDAYNAME7 , &H30 , 週の第7日名 LOCALE_SABBREVDAYNAME1 , &H31 , 週の第1日省略名 LOCALE_SABBREVDAYNAME2 , &H32 , 週の第2日省略名 LOCALE_SABBREVDAYNAME3 , &H33 , 週の第3日省略名 LOCALE_SABBREVDAYNAME7 , &H37 , 週の第7日省略名 LOCALE_SMONTHNAME1 , &H38 , 年の第1月名 LOCALE_SMONTHNAME2 , &H39 , 年の第2月名 LOCALE_SMONTHNAME3 , &H3A , 年の第3月名 LOCALE_SMONTHNAME12 , &H43 , 年の第12月名 LOCALE_SMONTHNAME13 , &H100E , 年の第13月名 LOCALE_SABBREVMONTHNAME1 , &H44 , 年の第1月省略名 LOCALE_SABBREVMONTHNAME2 , &H45 , 年の第2月省略名 LOCALE_SABBREVMONTHNAME3 , &H46 , 年の第3月省略名 LOCALE_SABBREVMONTHNAME12 , &H4F , 年の第12月省略名 LOCALE_STIME , &H1E , 区切り記号 LOCALE_STIMEFORMAT , &H1003 , 時間の形式 LOCALE_ITIME , &H23 , 時間制(12/24) LOCALE_ITIMEMARKPOSN , &H1005 , 午前午後記号の位置 LOCALE_ITLZERO , &H25 , 時刻前ゼロの有無 LOCALE_S1159 , &H28 , 午前の記号 LOCALE_S2359 , &H29 , 午後の記号