計算された金額の値を印刷するアプリがあり、その値をデフォルトの通貨形式で表示したい。
たとえば、ヨーロッパでは次のように記述します。
1.000,95€
米国では、次のように書くと思います
1,000.95 $
他の通貨では、小数の値は多かれ少なかれ表示されます。米国では2になりますが、日本では0になります。
既存のすべての通貨の可能な限り正確な形式を取得するにはどうすればよいですか?
私は解決策を見つけました。クラス NumberFormat には、多数の定義済みフォーマッタがあります。通貨の値をフォーマットするためのものもあります。
静的メソッドgetCurrencyInstanceを使用すると、クラスはデバイスのデフォルト通貨のフォーマッターを返します。次のコードを使用して、結果を設定します。
NumberFormat format = NumberFormat.getCurrencyInstance();
((TextView) findViewById(R.id.text_result)).setText(format.format(result));
完全を期すために、携帯電話の現在のロケール(正しい小数点記号と千単位の区切り記号)で、選択した通貨で価格を表示するとします。
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 にリストされています。
DecimalFormat
を確認してください。
西洋、アラビア語、またはインド数字のサポートを含め、あらゆるロケールで数値を解析およびフォーマットできるように設計されたさまざまな機能を備えています。また、整数( "123")、固定小数点数( "123.4")、科学表記法( "1.23E4")、パーセンテージ( "12%")、など、さまざまな種類の数値をサポートしています。および通貨額( "$ 123")。これらのフレーバーはすべて簡単にローカライズできます。
デバイスのロケールを取得するには、これを使用できます:
@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)