String.format () pour formater le double en java


178

Comment puis-je utiliser String.format (format String, X) pour formater un double comme suit ???

2354548,235 -> 2 354 548,23

Merci!

Réponses:


295
String.format("%1$,.2f", myDouble);

String.format utilise automatiquement les paramètres régionaux par défaut.


36
Vous pouvez également utiliser une locale spécifique en utilisantString.format(Locale.GERMAN, "%1$,.2f", myDouble);
Olivier Grégoire

13
S'il y a plus d'un double à formater, utilisez% 1,% 2, etc. Par exemple String.format ("% 1 $ ,. 2f,% 2 $ ,. 2f", myDouble, aDouble)
Moesio

4
Je pense que «% 1 $» est facultatif dans ce cas. Fonctionne pour moi avec juste "% ,. 2f" comme chaîne de format.
Matt Passell

5
Oui, Matt a raison. %1, %2et ainsi de suite peuvent être utilisés pour réorganiser la sortie en fonction de l'index de vos arguments d'entrée. Regarde ça . Vous pouvez omettre l'index et l'ordre par défaut sera assumé par le formateur.
praneetloke

1
Vous devriez expliquer ce que signifient les différentes parties.
Mitulát báti

41
String.format("%4.3f" , x) ;

Cela signifie que nous avons besoin d'un total de 4 chiffres en ans, dont 3 après la virgule. Et f est le spécificateur de format de double. x signifie la variable pour laquelle nous voulons le trouver. A travaillé pour moi. . .


1
Je pense que cela signifie que ce sera la quatrième variable dans les arguments qui suivent et qui ont 3 places après la virgule.
Michael Fulton

@MichaelFulton Ce n'est pas si simple: String.format("%014.3f" , 58.656565)-> 0000000058,657: 14 symboles au total: 8 zéros et 5 chiffres et 1 virgule. Donc, dans ce cas, le nombre 14 signifie le nombre total de symboles (les symboles supplémentaires sont remplacés par un zéro non significatif , pourraient se passer, puis ils seraient remplacés par un espace) dans la chaîne de résultat . La .3partie est ici complètement indépendante.
parsecer

Cependant ici: String.format("%014.3f" , 58.656565)-> 58,657. Je le prends parce que la préférence va à la .3fpièce: il imprime d'abord le nombre avec 3 décimales et après s'il reste des symboles, il imprime des espaces de début (ou des zéros / quoi que ce soit). Dans ce cas, le nombre est 2 + 3 + 1 = 6 symboles et nous voulions seulement imprimer 4, il n'y a donc certainement pas d'espaces supplémentaires.
parsecer

24

Si vous souhaitez le formater avec des symboles définis manuellement, utilisez ceci:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);
System.out.println(decimalFormat.format(1237516.2548)); //1,237,516.25

La mise en forme basée sur les paramètres régionaux est cependant préférable.


3
Réponse utile! Cependant, la dernière phrase «La mise en forme basée sur les paramètres régionaux est préférable, bien que» n'a pas de sens sans contexte. Il existe de très bons cas d'utilisation dans lesquels vous ne devez PAS utiliser de formatage basé sur les paramètres régionaux, lorsque vous souhaitez générer un format spécifique de la chaîne. Par exemple, vous implémentez l'exportation de vos données vers un fichier externe et vous souhaitez avoir un contrôle total sur le format, sans dépendre de la locale actuelle (ou de toute autre).
Honza Zidek

20

code extrait de ce lien ;

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + 
                   currentLocale.toString());

La sortie de cet exemple montre comment le format du même nombre varie avec les paramètres régionaux:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US

13
public class MainClass {
   public static void main(String args[]) {
    System.out.printf("%d %(d %+d %05d\n", 3, -3, 3, 3);

    System.out.printf("Default floating-point format: %f\n", 1234567.123);
    System.out.printf("Floating-point with commas: %,f\n", 1234567.123);
    System.out.printf("Negative floating-point default: %,f\n", -1234567.123);
    System.out.printf("Negative floating-point option: %,(f\n", -1234567.123);

    System.out.printf("Line-up positive and negative values:\n");
    System.out.printf("% ,.2f\n% ,.2f\n", 1234567.123, -1234567.123);
  }
}

Et imprimez:

3 (3) +3 00003
Format en virgule flottante par défaut: 1234567,123000 Virgule
flottante avec virgules: 1.234.567.123000 Virgule
flottante négative par défaut: -1.234.567.123000
virgule flottante négative: (1.234.567, 123000)

Line-up valeurs positives et négatives:
1.234.567,12
-1.234.567,12


2

Il existe de nombreuses façons de procéder. Ceux-ci sont donnés ci-dessous:

Supposons que votre numéro d'origine soit indiqué ci-dessous: double nombre = 2354548.235;

Utilisation NumberFormatet mode d'arrondi

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
    DecimalFormat decimalFormatter = (DecimalFormat) nf;
    decimalFormatter.applyPattern("#,###,###.##");
    decimalFormatter.setRoundingMode(RoundingMode.CEILING);

    String fString = decimalFormatter.format(number);
    System.out.println(fString);

Utilisation du formateur de chaînes

System.out.println(String.format("%1$,.2f", number));

Dans tous les cas, la sortie sera: 2354548.24

Remarque :

Lors de l'arrondi, vous pouvez ajouter RoundingMode votre formateur. Voici quelques modes d'arrondi donnés ci-dessous:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

Voici les importations :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

Utilisation DecimalFormat

 NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
 DecimalFormat decimalFormatter = (DecimalFormat) nf;
 decimalFormatter.applyPattern("#,###,###.##");
 String fString = decimalFormatter.format(myDouble);
 System.out.println(fString);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.