小数点表記の多国語対応

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();

で取得することができます。

※簡単な動作確認しかしておりませんので、利用は各人の責任でお願いします。

参考:

カテゴリー: Java パーマリンク

小数点表記の多国語対応 への1件のフィードバック

  1. ピンバック: Tweets that mention 小数点表記の多国語対応 | Android開発メモ -- Topsy.com

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です