今日は torstai 曜日です(国際化対応の話)

俺の書いたツールがヨーロッパ支社だとバグってるらしい。
どうやら数値のフォーマットの問題らしい。
そういえばヨーロッパだとカンマとピリオドが日本とは逆の国があったんだったなと思い出す。


これは .NET Framework のライブラリが中途半端に賢いのが要因で、
"地域と言語のオプション" から設定を変更すれば日本語 Windows でも再現可能なのだろうということは
すぐに察しがついたので、さっそくヨーロッパ支社(フィンランド)に合わせて
フィンランド語の設定にしてみた。


な、なんか "数値" の桁を区切る部分が表示されてないんですけど!?
コピペして、UCS-2 で保存してみたら 0x00A0 になった。
UTF-8 で保存してみたところ、0xC2, 0xA0 のシーケンスになった…。


本来恐らく "," になるべき所だと思うんだけど、Windows がバグってるのか?


まあそれでもこれでフィンランド語の Windows の状態になったはずだ。
ちゃんとタスクトレイ横のカレンダーも"木曜日" から "torstai" になってるし。


これでツールを試すと確かに例外で落ちた。
問題だったのは System.Decimal.Parse(String) と System.String.Format(String, params Object[])だった。
両方とも IFormatProvider を受け取るオーバーロードが存在するので、
ここは "コンピュータの世界では、真の意味の国際化対応はできず、かといって何処かの国を基準にできない場合はアメリカさんを基準にすべし" という世界的な暗黙のルールに従うことにする(面倒だったから)

CultureInfo usCulture = new CultureInfo("en-US");
NumberFormatInfo numberFormatInfo = usCulture.NumberFormat;

hogeValue = (decimal.Parse(numericalString, numberFormatInfo));
CultureInfo usCulture = new CultureInfo("en-US");
NumberFormatInfo numberFormatInfo = usCulture.NumberFormat;

hoge = String.Format(numberFormatInfo, "{0:f6}", hogeValue);


とりあえずこういう路線でしのごうと思う。