web-dev-qa-db-ja.com

負の金額のUSDを括弧ではなくマイナス記号でフォーマットする(Java)

マイナス記号を付けて負のUSD通貨値を出力するNumberFormat.getCurrencyInstance()を取得するにはどうすればよいですか?

30
Žygimantas

私は再びこの問題に直面したので、いくつかの調査を行ったところ、 [〜#〜] icu [〜#〜] によって提供されるより復元力のあるソリューションを見つけました:

NumberFormatter
  .withLocale(...)
  .unit(Currency.getInstance("USD"))
  .sign(SignDisplay.AUTO) // "123", "0", and "-123"
  .format(123)
  .toString();

詳細については、APIドキュメントの NumberFormatter を確認してください。

0
Žygimantas

ロケールに依存しない方法で行うには、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()は、すべてのシステムのすべてのロケールの値を返すとは限りませんが、主要なロケールでは機能するはずです(そして、それ自体で妥当なフォールバックがあると思うので、実行する必要はありませんなんでも)

36
ageektrapped

Javaクラスで、またはfmt:formatNumber jstlタグを介して、常に使用することになるものを以下に示します。

DecimalFormat format = new DecimalFormat("$#,##0.00;$-#,##0.00");
String formatted = format.format(15.5);

それは常に少なくとも0.00ドルを生み出し、表示されたときに一貫しています。必要に応じて、数千のセパレータも含まれます。必要に応じて、マイナス記号をドル記号の前に移動できます。

22
Gennadiy

試してください:

NumberFormat.getCurrencyInstance(Locale.CANADA);

2
E-dou

デフォルトに頼るのではなく特定の形式が必要な場合は、独自の DecimalFormat を作成するのがおそらく最善です。

編集:おそらく、NumberFormat.getCurrencyInstance()の結果をDecimalFormatにキャストして、好みに合わせて調整することもできます。

2
NumberFormat.getCurrencyInstance(Locale.UK);
0
Pnemonic

PoiがExcel通貨フォーマットの最初のオプションをサポートすることを拒否する理由は私を超えています! enter image description here

通貨に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!!!");
        }
    }
}
0
rheaghen