[Unity] カンマや小数点のローカライズ
はじめに
開発しているゲームがグローバルに展開される場合、文章を各言語へとローカライズする必要があります。
この時、対応すべきは文章だけでなくカンマや小数点も対象になります。
例えば、1234.567 という数値をカンマ付きで表示するとき、日本であれば 1,234.567 で問題ありません。
ところが、ドイツではコンマと小数点の役割が反転していて、1.234,567 と表記しなくてはなりません。
さらにフランスでは、桁区切りがスペースで表されるので、 1 234,567 と表記します。(変にスペースが入ったわけではありません。)
実装
float value = 1234.567f;
// テキストとして表示
_text.text = value.ToString("N3", new CultureInfo("fr"));
ToString()で浮動小数点を文字列に変換します。
第一引数の"N3"というのが、「小数点3桁までを桁区切り付きで」という指定になります。N0を指定すれば小数点以下を繰り上げたうえで文字列に変換します。
他にもいろいろ変換方法を指定できますが、今回は割愛します。
大事なのが第二引数で、CultureInfoを指定することで「どの国のカンマ、小数点表記にするか」を指定できます。
国はCultureInfoに渡している引数で指定可能で、今回の例ではフランス語(fr)を指定しています。
この国コードは下記のページに一覧が乗っています。
ゲームで設定されている言語に応じて、CultureInfoを適切に使い分けることで数値のローカライズが実現できると思います。
ちなみに、第二引数に何も指定しないことがほとんどだと思いますが、その場合は端末などで設定されている言語が使用されるらしいです。
余談
上記のように、国によってカンマや小数点の表記は変わります。
そのため、文字列を数値に変換するParseを使用する際は気を付けなければなりません。
"1,234.567"という文字列を数値に変換しようとすると、ドイツ語やフランス語を使用していた場合は失敗します。
普通に進行不能エラーを引き起こすので、極力使わない実装を心がける、または変換元の文字列のローカライズにも気を配る必要があります。
また、ローカライズする可能性があるプロジェクトでは、数値->文字列変換用のメソッドを最初から用意しておくのが吉です。
ゲームにおいて数値を文字列として表示する箇所は多岐に渡るので、各箇所でToString()で実装してしまうと後で「数値も全部ローカライズしよう」となったときに痛い目をみます。(体験談)
Discussion