web-dev-qa-db-fra.com

Comment utiliser DecimalFormat de Java pour un formatage de monnaie "intelligent"?

J'aimerais utiliser DecimalFormat de Java pour formater des doubles comme ceci:

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

Le mieux que je puisse trouver jusqu'à présent est:

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

Mais cela ne fonctionne pas pour le cas n ° 2 et génère à la place "100,5 $"

Éditer:

Beaucoup de ces réponses ne prennent en compte que les cas n ° 2 et n ° 3 et ne réalisent pas que leur solution fera que le n ° 1 formatera 100 en "100,00 $" au lieu de "100 $".

29
Peter

Doit-il utiliser DecimalFormat?

Sinon, il semble que ce qui suit devrait fonctionner:

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

Utilisez NumberFormat:

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

N'utilisez pas non plus de doubles pour représenter des valeurs exactes. Si vous utilisez des valeurs monétaires dans quelque chose comme une méthode Monte Carlo (où les valeurs ne sont pas exactes de toute façon), le double est préférable.

Voir aussi: Écrire Java programmes pour calculer et formater la devise

7
Alexandra Dumas

Essayer

new DecimalFormat("'$'0.00");

Éditer:

J'ai essayé

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));

et j'ai

$100.00
$100.50
$100.41
5
Bala R

Essayez d'utiliser

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

Vous pouvez utiliser le format suivant:

DecimalFormat dformat = new DecimalFormat ("$ #. ##");

1
mizanurahma

Vous pouvez cocher "est un nombre entier ou non" et choisir le format de nombre requis.

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);
  }
}

donnera exactement ce que vous voulez:

100
100.50
100.42
1
ashakirov

Je sais que c'est trop tard. Cependant, ce qui suit a fonctionné pour moi:

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.   

J'espère que cela aidera quiconque lira ceci à l'avenir :)

1

Vous pouvez essayer en utilisant deux objets DecimalFormat différents en fonction de la condition comme suit:

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

Vous pouvez utiliser la Java API Money pour y parvenir. (Bien que cela n'utilise pas 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