Comment puis-je formater un numéro de chaîne pour qu'il ait des virgules et un arrondi?

142

Quelle est la meilleure façon de formater le nombre suivant qui m'est donné sous forme de chaîne?

String number = "1000500000.574" //assume my value will always be a String

Je veux que ce soit une chaîne avec la valeur: 1,000,500,000.57

Comment puis-je le formater en tant que tel?

Sheehan Alam
la source

Réponses:

256

Vous voudrez peut-être regarder la DecimalFormatclasse; il prend en charge différents paramètres régionaux (par exemple: dans certains pays qui seraient formatés comme à la 1.000.500.000,57place).

Vous devez également convertir cette chaîne en un nombre, cela peut être fait avec:

double amount = Double.parseDouble(number);

Exemple de code:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));
NullUserException
la source
pouvez-vous montrer un exemple de la façon dont je peux utiliser NumberFormat avec ce cas particulier?
Sheehan Alam
1
vous pouvez également utiliser la solution ci-dessous - chaîne statique publique getRoundOffValue (double valeur) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); return df.format (valeur); }
Jitendra Nath
Je préfère également le zéro avant le point comme le formateur DecimalFormat = new DecimalFormat ("#, ## 0.00"); - obtenir .00 pour zéro sonne mal pour moi
Leo
45

Cela peut également être accompli en utilisant String.format (), qui peut être plus facile et / ou plus flexible si vous formatez plusieurs nombres dans une chaîne.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

Pour la chaîne de format "% ,. 2f" - "," signifie des groupes de chiffres séparés par des virgules, et ".2" signifie arrondi à deux places après la virgule.

Pour plus d'informations sur les autres options de formatage, voir https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Greg H
la source
42

Une fois que vous avez converti votre chaîne en nombre, vous pouvez utiliser

// format the number for the default locale
NumberFormat.getInstance().format(num)

ou

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)
Aaron Novstrup
la source
Comment spécifier à la fois les paramètres régionaux et arrondir à (disons) 2 décimales?
Jonik
6
Ah, tant new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
pis
16

Étant donné qu'il s'agit du résultat numéro un de Google format number commas java, voici une réponse qui fonctionne pour les personnes qui travaillent avec des nombres entiers et ne se soucient pas des décimales.

String.format("%,d", 2000000)

les sorties:

2,000,000
Ben Watson
la source
fonctionne également pour les flottants, par exemple, printf ("%, f \ n", decimalNumber)
philwalk
12

J'ai créé mon propre utilitaire de formatage. Ce qui est extrêmement rapide pour traiter le formatage et vous offre de nombreuses fonctionnalités :)

Elle supporte:

  • Formatage virgule Par exemple, 1234567 devient 1 234 567.
  • Préfixe avec "Mille (K), Million (M), Billion (B), Trillion (T)".
  • Précision de 0 à 15.
  • Redimensionnement de précision (signifie que si vous voulez une précision de 6 chiffres, mais que vous n'avez que 3 chiffres disponibles, cela le force à 3).
  • Réduction du préfixe (signifie que si le préfixe que vous choisissez est trop grand, il le réduit à un préfixe plus approprié).

Le code peut être trouvé ici . Vous l'appelez comme ceci:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

Je dois également souligner que cela ne gère pas le support décimal, mais est très utile pour les valeurs entières. L'exemple ci-dessus afficherait "1.23M" comme sortie. Je pourrais probablement ajouter le support décimal peut-être, mais je n'ai pas vu trop d'utilité depuis lors, je pourrais aussi bien fusionner cela dans un type de classe BigInteger qui gère les tableaux char [] compressés pour les calculs mathématiques.

Jeremy Trifilo
la source
2
C'est bien si vous travaillez uniquement en anglais. Ma suggestion est d'éviter une telle chose car cela a énervé le dîner de mes utilisateurs non anglais car ils ne pouvaient pas comprendre ce Kou ce que cela Msignifie
rishabhmhjn
@rishabhmhjn mais ... ne pourriez-vous pas simplement le modifier pour le modifier en n'importe quelle lettre dont vous avez besoin? votre malchance est-il de sa faute? : o et ce qu'il a créé est assez cool, malgré le lien semble indisponible pour le moment ..
Aquarius Power
@AquariusPower le problème est, par exemple, que les nombres japonais ne suivent pas le système métrique. Leurs nombres sont comme 1 百 pour 100, 1 千 pour 1000, 1 万 pour 10000, puis il devient 1 千万 pour 1000,0000. Mon équipe travaillait sur quelque chose de similaire en Javascript. Vous pouvez utiliser la logique mentionnée dans celui-ci: github.com/statusbrew/angular-bignumber
rishabhmhjn
J'ai trouvé mon ancien code pour cela, alors je l'ai remis en ligne sur GitHub. Le lien dans le commentaire a été mis à jour.
Jeremy Trifilo
6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}
user3314142
la source
6

vous pouvez également utiliser la solution ci-dessous -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}
Jitendra Nath
la source
4

Vous pouvez effectuer la conversion entière en une seule ligne, en utilisant le code suivant:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

Les deux derniers signes # dans le constructeur DecimalFormat peuvent également être des 0. De toute façon fonctionne.

Peter Griffin
la source
3

La première réponse fonctionne très bien, mais pour ZERO / 0, elle se formatera au format .00

D'où le format #, ## 0.00 fonctionne bien pour moi. Testez toujours différents nombres tels que 0/100 / 2334,30 et des nombres négatifs avant de déployer sur le système de production.

Venod Raveendran
la source
3

Voici le moyen le plus simple d'y arriver:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

sortie: 10 987 655,88

John Paker
la source