Formatage double décimal en Java


118

J'ai des problèmes pour formater les décimales d'un double. Si j'ai une valeur double, par exemple 4.0, comment formater les décimales pour qu'elles soient 4,00 à la place?




Réponses:


218

L'un des moyens serait d'utiliser NumberFormat .

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

Production:

4,00


1
Ouais, mais je ne veux pas de virgule, je veux un signe décimal.
Christoffer

J'obtiens une virgule. C'est ce que j'ai fait. "double variable; NumberFormat formatter = new DecimalFormat (" # 0.00 "); System.out.println (formatter.format (variable));
Christoffer

la sortie pour cela est X, 00 et non X.00
Christoffer

9
Vous obtenez une virgule à cause de la langue par défaut utilisée par votre JVM, qui est probablement différente de celle de Nambari. Jetez un œil à NumberFormat javadoc: docs.oracle.com/javase/1.4.2/docs/api/java/text/…
Michael Zilbermann

1
Comme zim2001 l'a indiqué, votre langue peut être différente. Lisez le lien fourni dans ma réponse. À la fin, vous trouverez des informations à ce sujet.
kosa

73

Avec Java 8, vous pouvez utiliser la formatméthode ..: -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • fest utilisé pour la floatingvaleur en points.
  • 2 après la décimale, le nombre de décimales après .

Pour la plupart des versions de Java, vous pouvez utiliser DecimalFormat: -

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));

43

Utilisez String.format :

String.format("%.2f", 4.52135);

Selon la documentation:

La locale toujours utilisée est celle renvoyée par Locale.getDefault().


8
String.format accepte également une locale comme premier paramètre pour tenir compte du formatage du signe décimal.
Vincent Mimoun-Prat

4
Pour éviter les signes décimaux spécifiques aux paramètres régionaux (tels qu'une virgule), spécifiez les paramètres régionaux américains: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233

3
Je dirais "d'utiliser un point spécifique aux paramètres régionaux américains comme signe décimal, spécifiez les paramètres régionaux américains" .. cette idée que les habitudes américaines sont les bonnes et que tout le reste est un peu "folk" me rend fou.
Simone Gianni

@SimoneGianni Ne faites pas d'hypothèses stupides, certaines personnes pourraient avoir besoin que la décimale soit un point. Par exemple, j'écris une fonction qui exporte un document CSV, et je ne peux pas avoir de virgule car la virgule est le délimiteur.
Kaiser Keister

19

En utilisant String.format, vous pouvez faire ceci:

double price = 52000;
String.format("$%,.2f", price);

Remarquez la virgule qui rend cela différent de la réponse de @ Vincent

Production:

$52,000.00

Une bonne ressource pour la mise en forme est officielle page java sur le sujet


6

Vous pouvez toujours utiliser la méthode statique printf from System.out- vous implémentez ensuite le formateur correspondant; cela économise de l'espace de tas dans lequel d'autres exemples vous obligent à faire.

Ex:

System.out.format("%.4f %n", 4.0); 

System.out.printf("%.2f %n", 4.0); 

Économise de l'espace sur le tas, ce qui est un gros bonus, néanmoins je suis d'avis que cet exemple est beaucoup plus gérable que toute autre réponse, d'autant plus que la plupart des programmeurs connaissent la fonction printf à partir de C (Java change légèrement la fonction / méthode).


1
@Baz Il me manque un détail crucial ici, il n'y a pas de printStream mentionné. L'OP demande une aide au formatage (qui pourrait être résolue plus facilement en consultant la documentation Java) vers le flux de sortie standard. Explique.
Lewis Robbins

Ma faute. Regardait la mauvaise version de javadoc (1.4). BTW: outest le PrintStream.
Baz

@Baz Pas de soucis. Oui, j'ai supposé que c'était la classe à laquelle vous faisiez référence, dans tous mes livres printf est appelée la méthode statique de System.out (car ces méthodes sont statiques).
Lewis Robbins

1
Pour être exact, printfest une méthode statique de PrintStream. Voir ici ;) Mais +1 néanmoins.
Baz

@Baz D'après la documentation, la classe printStream a hérité de System.out. Je pourrais peut-être me tromper - même s'il est assez étrange d'hériter d'une méthode statique (est-ce même possible)? Vous êtes, je suppose que c'est correct.
Lewis Robbins

4
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));


1

Une autre méthode consiste à utiliser la setMinimumFractionDigitsméthode de la NumberFormatclasse.

Ici, vous spécifiez essentiellement le nombre de nombres que vous souhaitez afficher après la virgule décimale.

Donc, une entrée de 4.0produirait 4.00, en supposant que votre montant spécifié était de 2.

Mais, si votre Doubleentrée contient plus que le montant spécifié, il prendra le montant minimum spécifié, puis ajoutera un chiffre supplémentaire arrondi vers le haut / bas

Par exemple, 4.15465454avec une quantité minimale de 2 spécifiée produira4.155

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

Essayez-le en ligne


1

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 number = 2354548.235;

Utilisation de NumberFormat:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

Utilisation de String.format:

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

Utilisation de DecimalFormat et du motif:

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
        DecimalFormat decimalFormatter = (DecimalFormat) nf;
        decimalFormatter.applyPattern("#,###,###.##");
        String fString = decimalFormatter.format(number);
        System.out.println(fString);

Utilisation de DecimalFormat et du motif

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

Dans tous les cas, la sortie sera: 2354548.23

Remarque :

Lors de l'arrondi, vous pouvez ajouter RoundingModevotre 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

Vous pouvez utiliser l'une des méthodes ci-dessous

  1. Si vous utilisez java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));

    OU

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Si vous souhaitez le convertir en format de chaîne simple

    System.out.println(String.format("%.2f", 4.0)); 

Tout le code ci-dessus imprimera 4,00


0

Fonctionne à 100%.

import java.text.DecimalFormat;

public class Formatting {

    public static void main(String[] args) {
        double value = 22.2323242434342;
        // or  value = Math.round(value*100) / 100.0;

        System.out.println("this is before formatting: "+value);
        DecimalFormat df = new DecimalFormat("####0.00");

        System.out.println("Value: " + df.format(value));
    }

}

-3

Première importation NumberFormat. Puis ajoutez ceci:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

Cela vous donnera deux décimales et mettra un signe dollar s'il s'agit de monnaie.

import java.text.NumberFormat;
public class Payroll 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
    int hoursWorked = 80;
    double hourlyPay = 15.52;

    double grossPay = hoursWorked * hourlyPay;
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
    }

}

1
La question ne concerne pas l'affichage d'une devise et est répondue plus précisément en utilisant des fonctions de formatage (comme décrit dans d'autres réponses).
yacc

-4

Vous pouvez le faire comme suit:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

1
Ne fonctionne pas parce qu'il utilise à la ##place de00
Joaquin Iurchuk

-4

Je sais que c'est un vieux sujet, mais si vous aimez vraiment avoir le point au lieu de la virgule, enregistrez simplement votre résultat sous X, 00 dans une chaîne, puis modifiez-le simplement pour une période pour obtenir le X.00

Le moyen le plus simple consiste simplement à utiliser replace.

String var = "X,00";
String newVar = var.replace(",",".");

La sortie sera le X.00 que vous vouliez. Aussi pour faciliter les choses, vous pouvez tout faire en un seul et l'enregistrer dans une double variable:

Double var = Double.parseDouble(("X,00").replace(",",".");

Je sais que cette réponse n'est pas utile pour le moment, mais peut-être que quelqu'un qui vérifie ce forum cherchera une solution rapide comme celle-ci.

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.