web-dev-qa-db-ja.com

「スマート」通貨フォーマットにJavaのDecimalFormatを使用する方法は?

JavaのDecimalFormatを使用して、doubleを次のようにフォーマットします。

#1 - 100 -> $100
#2 - 100.5 -> $100.50
#3 - 100.41 -> $100.41

これまでに思いつく最高のものは:

new DecimalFormat("'$'0.##");

しかし、これはケース#2では機能せず、代わりに「$ 100.5」を出力します

編集:

これらの回答の多くは、ケース#2と#3のみを考慮しており、それらのソリューションにより#1が100を「$ 100」ではなく「$ 100.00」としてフォーマットすることを認識していません。

29
Peter

DecimalFormatを使用する必要がありますか?

そうでない場合、次のように動作するはずです。

String currencyString = NumberFormat.getCurrencyInstance().format(currencyNumber);
//Handle the weird exception of formatting whole dollar amounts with no decimal
currencyString = currencyString.replaceAll("\\.00", "");
22
Bradley Swain

NumberFormatを使用します。

NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
double doublePayment = 100.13;
String s = n.format(doublePayment);
System.out.println(s);

また、正確な値を表すためにdoubleを使用しないでください。モンテカルロ法(値がとにかく正確でない)のようなもので通貨値を使用している場合、doubleが推奨されます。

参照: Write Java通貨を計算およびフォーマットするプログラム

7
Alexandra Dumas

試してみる

new DecimalFormat("'$'0.00");

編集:

私は試した

DecimalFormat d = new DecimalFormat("'$'0.00");

        System.out.println(d.format(100));
        System.out.println(d.format(100.5));
        System.out.println(d.format(100.41));

そして得た

$100.00
$100.50
$100.41
5
Bala R

使用してみてください

DecimalFormat.setMinimumFractionDigits(2);
DecimalFormat.setMaximumFractionDigits(2);
2
Rafael T

次の形式を使用できます。

DecimalFormat format = new DecimalFormat( "$#。##");

1
mizanurahma

「数値全体かどうか」をチェックして、必要な数値形式を選択できます。

public class test {

  public static void main(String[] args){
    System.out.println(function(100d));
    System.out.println(function(100.5d));
    System.out.println(function(100.42d));
  }

  public static String function(Double doubleValue){
    boolean isWholeNumber=(doubleValue == Math.round(doubleValue));
    DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols(Locale.GERMAN);
    formatSymbols.setDecimalSeparator('.');

    String pattern= isWholeNumber ? "#.##" : "#.00";    
    DecimalFormat df = new DecimalFormat(pattern, formatSymbols);
    return df.format(doubleValue);
  }
}

あなたが望むものを正確に与えます:

100
100.50
100.42
1
ashakirov

遅すぎることはわかっています。しかし、次は私のために働いた:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.UK);
new DecimalFormat("\u00A4#######0.00",otherSymbols).format(totalSale);

 \u00A4 : acts as a placeholder for currency symbol
 #######0.00 : acts as a placeholder pattern for actual number with 2 decimal 
 places precision.   

これが将来これを読む人に役立つことを願っています:)

次のように、条件に基づいて2つの異なるDecimalFormatオブジェクトを使用して試すことができます。

double d=100;
double d2=100.5;
double d3=100.41;

DecimalFormat df=new DecimalFormat("'$'0.00");

if(d%1==0){ // this is to check a whole number
    DecimalFormat df2=new DecimalFormat("'$'");
    System.out.println(df2.format(d));
}

System.out.println(df.format(d2));
System.out.println(df.format(d3));

Output:-
$100
$100.50
$100.41
1
Sai Gattu

これを実現するには、Java Money APIを使用できます(ただし、これはDecialFormatを使用していません))

long amountInCents = ...;
double amountInEuro = amountInCents / 100.00;

String customPattern; 
if (minimumOrderValueInCents % 100 == 0) {
    customPattern = "# ¤";
} else {
    customPattern = "#.## ¤";
}

Money minDeliveryAmount = Money.of(amountInEuro, "EUR");
MonetaryAmountFormat formatter = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder.of(Locale.GERMANY)
            .set(CurrencyStyle.SYMBOL)
            .set("pattern", customPattern)
            .build());

System.out.println(minDeliveryAmount);
0
Sebastian Thees