110 votes

Format des nombres en devise Java

Existe-t-il un moyen de formater une décimale comme suit :

100   -> "100"  
100.1 -> "100.10"

S'il s'agit d'un nombre rond, omettez la partie décimale. Sinon, formatez-le avec deux décimales.

181voto

duffymo Points 188155

Je vous recommande d'utiliser le paquet java.text :

double money = 100.1;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
String moneyString = formatter.format(money);
System.out.println(moneyString);

Cela présente l'avantage supplémentaire d'être spécifique à la région.

Mais, si vous le devez, tronquez la chaîne de caractères que vous récupérez si c'est un dollar entier :

if (moneyString.endsWith(".00")) {
    int centsIndex = moneyString.lastIndexOf(".00");
    if (centsIndex != -1) {
        moneyString = moneyString.substring(1, centsIndex);
    }
}

25 votes

Vous ne devez jamais utiliser un double pour représenter des devises. Soit vous convertissez en long et gérez vous-même le point décimal, soit vous utilisez la fonction BigDecimal avec un formateur. joda-money.sourceforge.net devrait être une bibliothèque agréable à utiliser une fois qu'elle sera terminée.

5 votes

Je suis d'accord sur le fait que double != argent, mais ce n'est pas comme ça que la question a été posée.

3 votes

Comment ça, c'est comme ça que les devises fonctionnent ? Je peux dire que quelque chose coûte 1 $ et non 1,00 $.... il y a différentes façons d'afficher les devises (autres que celles par défaut) et cette question demande comment omettre la partie décimale si c'est un nombre entier.

157voto

Thilina Points 31
double amount =200.0;
Locale locale = new Locale("en", "US");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
System.out.println(currencyFormatter.format(amount));

ou

double amount =200.0;
System.out.println(NumberFormat.getCurrencyInstance(new Locale("en", "US"))
        .format(amount));

La meilleure façon d'afficher les devises

Sortie

$200.00

Si vous ne voulez pas utiliser de signe, utilisez cette méthode

double amount = 200;
DecimalFormat twoPlaces = new DecimalFormat("0.00");
System.out.println(twoPlaces.format(amount));

200.00

Ceci peut également être utilisé (avec le séparateur de milliers).

double amount = 2000000;    
System.out.println(String.format("%,.2f", amount));          

2,000,000.00

0 votes

Il ne semble pas que "currency" soit référencé ou utilisé après sa déclaration... Y a-t-il un effet secondaire de la ligne 3 ? Ou une raison pour laquelle vous l'avez incluse ?

0 votes

En savoir plus sur [Class Locale][1] [1] : docs.oracle.com/javase/7/docs/api/java/util/

51voto

extraneon Points 13362

J'en doute. Le problème est que 100 n'est jamais 100 si c'est un flottant, c'est normalement 99.9999999999 ou 100.0000001 ou quelque chose comme ça.

Si vous voulez le formater de cette manière, vous devez définir un epsilon, c'est-à-dire une distance maximale par rapport à un nombre entier, et utiliser un formatage entier si la différence est plus petite, et un flottant sinon.

Quelque chose comme ça ferait l'affaire :

public String formatDecimal(float number) {
  float epsilon = 0.004f; // 4 tenths of a cent
  if (Math.abs(Math.round(number) - number) < epsilon) {
     return String.format("%10.0f", number); // sdb
  } else {
     return String.format("%10.2f", number); // dj_segfault
  }
}

8 votes

Petit bémol : un flottant peut être exactement égal à 100, avec le schéma binaire 0x42c80000.

3 votes

Oui, comme l'a dit Karol S, de nombreux nombres PEUVENT être exactement assortis de flottants. Mais pas TOUS les nombres. 100 est un nombre qui peut être représenté, vous devez simplement tenir compte des nombres qui ne peuvent pas l'être.

22voto

wu liang Points 611

Je n'ai pas trouvé de bonne solution après une recherche sur Google, je me contente de poster ma solution pour que d'autres personnes puissent s'y référer. priceToString pour formater l'argent.

public static String priceWithDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.00");
    return formatter.format(price);
}

public static String priceWithoutDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.##");
    return formatter.format(price);
}

public static String priceToString(Double price) {
    String toShow = priceWithoutDecimal(price);
    if (toShow.indexOf(".") > 0) {
        return priceWithDecimal(price);
    } else {
        return priceWithoutDecimal(price);
    }
}

1 votes

Il n'a jamais dit que c'était le meilleur. Il a juste posté sa solution pour que d'autres puissent s'en inspirer. Le moins que vous puissiez faire est de le remercier.

1 votes

Que faire si je veux afficher le prix au format indien. Sans décimales. Format --> ##,##,###

1 votes

À la méthode priceWithDecimal(Double), essayez de changer le masque "###,###,###.00" à "###,###,##0.00" pour afficher "0,00" lorsque la valeur est "0".

6voto

Dirk Lachowski Points 1300

J'utilise celle-ci (en utilisant StringUtils de commons-lang) :

Double qty = 1.01;
String res = String.format(Locale.GERMANY, "%.2f", qty);
String fmt = StringUtils.removeEnd(res, ",00");

Vous devez seulement vous occuper de la locale et de la chaîne correspondante à hacher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X