Twitterでそのような話題になったので、調査&メモ。
小数点の表記は、日本では「.」(ピリオド)を使いますが、海外では事情が異なります(参考:海外の言語別の小数点および桁区切りの記号一覧)。
これをプログラムで解決しようと思うと、かなり複雑になります。
- 国(地域)により、数値のフォーマットを用意しないといけないよね!
- どの国(地域)が、どのフォーマットを使っているのか、調べないといけないよね!
- 小数点以下の数値と整数を分けたい場合、どうやって切り分ける?切り分け失敗するとエラーになるよ!
という感じで、結論として「やってられるかー! (ノ≧∇≦)ノミ ┸┸おりゃー」となりますw
Javaには、そういった「地域によるフォーマットの違い」を吸収する仕組みが用意されています。
Javaには「java.text.DecimalFormat()」クラスが用意されており、これとLocale()を組み合わせることで、国(地域)に対応した数値フォーマットで値を表示することができます。サンプルとして、指定した言語ロケールの浮動小数点をStringオブジェクトに変換するメソッドを作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * ロケールで指定された地域のフォーマットで、小数点数値を文字列に変換する * @param locale ロケール * @param format 数値フォーマット。DecimalFormatで使用できるフォーマットを指定する(###,###.###など) * @param value 浮動小数点値 * @return ロケース指定された地域のフォーマットで文字列化された小数点数値 */ public static String convertDoubleToString(Locale locale, String format, double value) { //数値の表示フォーマットを設定する NumberFormat nf = NumberFormat.getNumberInstance(locale); DecimalFormat df = (DecimalFormat) nf; df.applyPattern(format); //小数点数値を文字列化し、その値を返す return df.format(value); } |
また、国(地域)の浮動小数点数文字列をdouble型に変換するメソッドも作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** * ロケールで指定された地域の数値をdouble型に変換する * @param locale ロケール * @param strvalue 浮動小数点数(文字列) * @return double型に変換された文字列の浮動小数点数 */ public static double convertStringToDouble(Locale locale, String strValue) { //数値解析のインデックスを初期化する ParsePosition pp = new ParsePosition(0); pp.setIndex(0); //数値の表示フォーマットを設定する NumberFormat nf = NumberFormat.getNumberInstance(locale); //文字列から数値に変換し、その値を返す return nf.parse(strValue, pp).doubleValue(); } |
なお、現在の言語設定は、
Locale.getDefault();
で取得することができます。
※簡単な動作確認しかしておりませんので、利用は各人の責任でお願いします。
参考:
ピンバック: Tweets that mention 小数点表記の多国語対応 | Android開発メモ -- Topsy.com