Comment formater un nombre en Java ?
Quelles sont les "meilleures pratiques" ?
Devrai-je arrondir un nombre avant de le formater ?
32.302342342342343
=>32.30
.7323
=>0.73
etc.
Comment formater un nombre en Java ?
Quelles sont les "meilleures pratiques" ?
Devrai-je arrondir un nombre avant de le formater ?
32.302342342342343
=>32.30
.7323
=>0.73
etc.
De ce fil Il existe plusieurs façons de procéder :
double r = 5.1234;
System.out.println(r); // r is 5.1234
int decimalPlaces = 2;
BigDecimal bd = new BigDecimal(r);
// setScale is immutable
bd = bd.setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP);
r = bd.doubleValue();
System.out.println(r); // r is 5.12
f = (float) (Math.round(n*100.0f)/100.0f);
DecimalFormat df2 = new DecimalFormat( "#,###,###,##0.00" );
double dd = 100.2397;
double dd2dec = new Double(df2.format(dd)).doubleValue();
// The value of dd2dec will be 100.24
El DecimalFormat() semble être la manière la plus dynamique de le faire, et elle est également très facile à comprendre en lisant le code des autres.
Merci pour cette explication. Cependant, Intellij recommande d'utiliser Double.valueOf
au lieu de new Double(number).doubleValue()
. La dernière ligne du dernier exemple serait donc double dd2dec = Double.valueOf(df2.format(dd));
Le modèle DecimalFormat de cette réponse est excellent pour les États-Unis, mais faux dans la plupart des autres pays du monde. Le caractère de regroupement (virgule aux États-Unis, mais espace ou point dans les autres pays), la taille du regroupement (trois aux États-Unis et dans la plupart des pays, mais différente en Inde), le caractère décimal (point aux États-Unis, mais virgule dans les autres pays). La façon correcte d'obtenir une instance de DecimalFormat est la suivante : DecimalFormat df = (DecimalFormat)NumberFormat.getNumberInstance(locale)
Vous et String.format()
seront les nouveaux meilleurs amis !
https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax
String.format("%.2f", (double)value);
Cette réponse n'aurait pas obtenu autant de votes positifs si elle avait été donnée par quelqu'un d'autre. String.format
sert à formater les chaînes de caractères, pas les chiffres.
En fait, String.format est comme le printf du C. Il peut formater plusieurs types de données.
Lorsque vous voulez convertir la valeur arrondie en chaîne de caractères, c'est l'une des façons de le faire. L'autre consiste à utiliser DecimalFormat
. Et DecimalFormat
est légèrement plus rapide que String.format
. Simple System.currentTimeMillis
diff révèle que.
Sachez que les classes qui descendent de NumberFormat (et la plupart des autres descendants de Format) ne sont pas synchronisées. C'est une pratique courante (mais dangereuse) de créer des objets format et de les stocker dans des variables statiques dans une classe util. En pratique, cela fonctionnera presque toujours jusqu'à ce qu'il commence à subir une charge importante.
Des chiffres ronds, oui. C'est le principal exemple source .
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.util.*;
import java.text.*;
public class DecimalFormatDemo {
static public void customFormat(String pattern, double value ) {
DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);
}
static public void localizedFormat(String pattern, double value, Locale loc ) {
NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern(pattern);
String output = df.format(value);
System.out.println(pattern + " " + output + " " + loc.toString());
}
static public void main(String[] args) {
customFormat("###,###.###", 123456.789);
customFormat("###.##", 123456.789);
customFormat("000000.000", 123.78);
customFormat("$###,###.###", 12345.67);
customFormat("\u00a5###,###.###", 12345.67);
Locale currentLocale = new Locale("en", "US");
DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(currentLocale);
unusualSymbols.setDecimalSeparator('|');
unusualSymbols.setGroupingSeparator('^');
String strange = "#,##0.###";
DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
weirdFormatter.setGroupingSize(4);
String bizarre = weirdFormatter.format(12345.678);
System.out.println(bizarre);
Locale[] locales = {
new Locale("en", "US"),
new Locale("de", "DE"),
new Locale("fr", "FR")
};
for (int i = 0; i < locales.length; i++) {
localizedFormat("###,###.###", 123456.789, locales[i]);
}
}
}
Utilisez Format décimal .
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.