web-dev-qa-db-ja.com

デバイス通貨形式で浮動小数点値をフォーマットする方法は?

計算された金額の値を印刷するアプリがあり、その値をデフォルトの通貨形式で表示したい。

たとえば、ヨーロッパでは次のように記述します。

1.000,95€

米国では、次のように書くと思います

1,000.95 $

他の通貨では、小数の値は多かれ少なかれ表示されます。米国では2になりますが、日本では0になります。

既存のすべての通貨の可能な限り正確な形式を取得するにはどうすればよいですか?

49
Janusz

私は解決策を見つけました。クラス NumberFormat には、多数の定義済みフォーマッタがあります。通貨の値をフォーマットするためのものもあります。

静的メソッドgetCurrencyInstanceを使用すると、クラスはデバイスのデフォルト通貨のフォーマッターを返します。次のコードを使用して、結果を設定します。

NumberFormat format = NumberFormat.getCurrencyInstance();
((TextView) findViewById(R.id.text_result)).setText(format.format(result));
76
Janusz

完全を期すために、携帯電話の現在のロケール(正しい小数点記号と千単位の区切り記号)で、選択した通貨で価格を表示するとします。

NumberFormat format = NumberFormat.getCurrencyInstance(Locale.getDefault());
format.setCurrency(Currency.getInstance("CZK"));
String result = format.format(1234567.89);

resultはこれらの値を保持します:

  • CZK1,234,567.89米国ロケール
  • 1 234 567,89 Kčチェコ語ロケール

価格の小数部分を省略したい場合は($199 の代わりに $199.00)フォーマッタを使用する前にこれを呼び出します:

format.setMinimumFractionDigits(0);

すべてのオプションは NumberFormat docs にリストされています。

69
Eugen Pechanec

DecimalFormat を確認してください。

西洋、アラビア語、またはインド数字のサポートを含め、あらゆるロケールで数値を解析およびフォーマットできるように設計されたさまざまな機能を備えています。また、整数( "123")、固定小数点数( "123.4")、科学表記法( "1.23E4")、パーセンテージ( "12%")、など、さまざまな種類の数値をサポートしています。および通貨額( "$ 123")。これらのフレーバーはすべて簡単にローカライズできます。

3
user658042

デバイスのロケールを取得するには、これを使用できます:

@TargetApi(Build.VERSION_CODES.N)
    public static Locale getCurrentLocale(Context c) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return c.getResources().getConfiguration().getLocales().get(0);
        } else {
            //noinspection deprecation
            return c.getResources().getConfiguration().locale;
        }

そして、フォーマットを行うには:

        double num = 1323.526;

        NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(getCurrentLocale(getContext()));
        defaultFormat.format(num)
1