マイナス記号を付けて負のUSD通貨値を出力するNumberFormat.getCurrencyInstance()
を取得するにはどうすればよいですか?
私は再びこの問題に直面したので、いくつかの調査を行ったところ、 [〜#〜] icu [〜#〜] によって提供されるより復元力のあるソリューションを見つけました:
NumberFormatter
.withLocale(...)
.unit(Currency.getInstance("USD"))
.sign(SignDisplay.AUTO) // "123", "0", and "-123"
.format(123)
.toString();
詳細については、APIドキュメントの NumberFormatter を確認してください。
ロケールに依存しない方法で行うには、NumberFormat.getCurrencyInstance()
によって返されるDecimalFormatを少し調整する必要があります。これが私がやったことです(Androidでテスト済み):
_DecimalFormat formatter = (DecimalFormat)NumberFormat.getCurrencyInstance();
String symbol = formatter.getCurrency().getSymbol();
formatter.setNegativePrefix(symbol+"-"); // or "-"+symbol if that's what you need
formatter.setNegativeSuffix("");
_
IIRC、Currency.getSymbol()
は、すべてのシステムのすべてのロケールの値を返すとは限りませんが、主要なロケールでは機能するはずです(そして、それ自体で妥当なフォールバックがあると思うので、実行する必要はありませんなんでも)
Javaクラスで、またはfmt:formatNumber jstlタグを介して、常に使用することになるものを以下に示します。
DecimalFormat format = new DecimalFormat("$#,##0.00;$-#,##0.00");
String formatted = format.format(15.5);
それは常に少なくとも0.00ドルを生み出し、表示されたときに一貫しています。必要に応じて、数千のセパレータも含まれます。必要に応じて、マイナス記号をドル記号の前に移動できます。
試してください:
NumberFormat.getCurrencyInstance(Locale.CANADA);
デフォルトに頼るのではなく特定の形式が必要な場合は、独自の DecimalFormat
を作成するのがおそらく最善です。
編集:おそらく、NumberFormat.getCurrencyInstance()の結果をDecimalFormat
にキャストして、好みに合わせて調整することもできます。
NumberFormat.getCurrencyInstance(Locale.UK);
PoiがExcel通貨フォーマットの最初のオプションをサポートすることを拒否する理由は私を超えています!
通貨にDecimalFormatを使用するのは好きではありません。通貨記号の導入により、エンドセルの値が非数値になるためです。大手金融機関で働いていたとき、私はこのフォーマットの問題を解決する義務がありました。この変更の核となる考え方は、POIが合理的でなく、Excelのネイティブオプションを包括的にサポートすることを拒否しているため、私は彼らのコードに潜入し、コアでそれらの値を変更します。以下は私の回避策です:
private static final String CURRENCY_FORMAT_OVERRIDE = "\"$\"#,##0.00_);-\"$\"#,##0.00";
private static final String CURRENCY_FORMAT_TARGET = "\"$\"#,##0.00_);(\"$\"#,##0.00)";
static { // static class level initializer
Field field = org.Apache.poi.ss.usermodel.BuiltinFormats.class.getDeclaredField("_formats");
field.setAccessible(true);
String[] _formats = (String[])field.get(new org.Apache.poi.ss.usermodel.BuiltinFormats());
for(int i = 0; i < _formats.length; ++i) {
if(_formats[i].equals(CURRENCY_FORMAT_TARGET)) {
_formats[i]=CURRENCY_FORMAT_OVERRIDE;
System.out.println("TAKE THAT, POI!!!");
}
}
}