LinqPadでCultureInfoをDumpして見た
かなりお疲れ気味で、久しぶりの更新になりました。
先週、箕面温泉のスパーガーデンに行ってきましたが、全く疲れが取れず、逆に疲れがどっと出ている感じです。
箕面の滝までの道には、ポケモンGOをやっている人たちも大勢いましたが、自分はちびっこもいるので、昆虫館までしか歩きませんでした。
Intelマップ使っていますか?
Ingressのポータルがかなり流用されているので、遠出するときは密集地を探す参考になりますよ。
さて、小数点と桁区切りが、ピリオド(., U+0x002E)とカンマ(,, U+0x002C)しかないと思い込んでいる初心者は別として、中央ヨーロッパなどでは、小数点がカンマ(,, U+0x002C)で桁区切りがピリオド(., U+0x002E)になっていることが多いのは皆さんご存知の通り。
しかし、桁区切り文字にはスペースやアポストロフィ(', U+0x0027)などが使用されている国があるし、その時の小数点にはピリオド(., U+0x002E)もカンマ(,, U+0x002C)も使用されている。
しかし、恥ずかしながら、自分はスペースがU+0x0020だとばかり思い込んでいたが、国際化対応したdecimal値表示の単体テストで、ChainingAssertionで、文字列化した1500m(decimal)を文字列と比較したときにそうでないことに気付いた。
var provider = CultureInfo.CreateSpecificCulture("fr-FR"); decimal value = 1500m; value.ToString("N", provider).Is("1 500,00"); // Test failed because NumericGroupSeparator is U+0x00A not 0x0020.
U+0x00A0だとわかったのは、デバッガで止めて、ToString()の結果をメモ帳にコピーして保存して、Visual StudioのBinary Editorで開いて見たからだ。
文字コード表を開くとわかるが、U+0x00Aは、No-Break Spaceといって、キーボードで入力する場合はAlt+160で入力する。
160は0x00A0の十進数表記で、タイプするときは必ずテンキーで入力する必要がある。
「そういえば、初めて自分が担当したソフトで、ドイツ語圏のお客さんに納品したときに、いきなり1.500の意味で1,500を入力されて、1500とParseされて、受け入れテストNGくらったな・・・」
とふと思い出したが、
「その時にちゃんと調べておけば良かった・・・」
「これだとアポストロフィも怪しい・・・」
というわけで、
「調査!!」
リファレンスは、この辺。
NumberFormatInfo クラス (System.Globalization)
IFormatProvider、NumberFormatInfo、および数値の書式設定
NumberFormatInfo のプロパティおよび書式指定文字列
「WPFのDataGridにでも、全LCIDの情報を表示するプログラムを書くか・・・」
とプロジェクトを起こし始めたが、LinqPadを思い出した。
C#で書いたスクリプトを直ぐに実行して、Collectionの内容をDataGridで表示してみたり、Chartアセンブリを読み込んで視覚化するのに皆さん良く使用しているという話だが、自分は使ったことがなかった。
Google先生に聞いて、ここ
を参考に作業。
実行してみると、
- 809の国と地域がある
- 日本/米国と違うパターンは399の国と地域
- 日本/米国の逆と違うパターンは243の国と地域
- 小数点にスラッシュ(/, U+0x002F)が使用されているのは2つの国と地域
- 区切り文字はカンマ(,, U+0x002C)
- 小数点にピリオド(., U+0x002E)かカンマ(,, U+0x002C)が使用されているのは241の国と地域
- 区切り文字にスペース( , U+0x00A0)が使用されているのは230の国と地域
- 区切り文字にアポストロフィ(', U+0x0027)が使用されているのは3の国と地域
- 区切り文字にシングルクォーテーションマーク(', U+0x2019)が使用されているのは8の国と地域
アポストロフィ(', U+0x0027)やシングルクォーテーションマーク(', U+0x2019)はスイスが多い。
ロシュとか大手企業相手なら知りませんとは言えんだろうな・・・