Forzar el punto (".") Como separador decimal en Java


103

Actualmente uso el siguiente código para imprimir un doble:

return String.format("%.2f", someDouble);

Esto funciona bien, excepto que Java usa el separador decimal de mi Locale (una coma) mientras que me gustaría usar un punto. ¿Hay una forma fácil de hacer esto?


Si necesita usar el valor doble con decimales precisos, tal vez debería usar BigDecimal en lugar de double / Double. Consulte este enlace para conocer los problemas que puede encontrar al usar variables dobles. También puede probar esto: System.out.println (5.1d + 1.1d); - el resultado será 6.199999999999999 en lugar de 6.2. Creo que alguien que busque cómo formatear números con decimales como String debe omitir las variables dobles.
razvanone

Respuestas:


172

Utilice la sobrecarga String.formatque le permite especificar la configuración regional:

return String.format(Locale.ROOT, "%.2f", someDouble);

Si solo está formateando un número, como está aquí, entonces NumberFormatprobablemente usarlo sería más apropiado. Pero si necesita el resto de las capacidades de formato de String.format, esto debería funcionar bien.


6
Locale.ROOT es más neutral.
speedogoo

@speedogoo: Editado, aunque sospecho que para el formato de números no hace ninguna diferencia.
Jon Skeet

1
Sí, pero no es necesario que elija entre EE. UU. Y Reino Unido. 😜
speedogoo

2
Locale.ROOT también es seguro contra posibles cambios futuros en la elección de separador decimal de un país.
Attila Tanyi

En mi opinión, esto no responde a la pregunta, más bien Locale.setDefault (new Locale ("en", "US")); hace lo que se indica en otra respuesta. Es cierto que tal vez tenga efectos secundarios indeseables ya que es global, OTH como programador lo que realmente quiero es que el valor global predeterminado sea US porque en todas las demás partes de mi código donde me importa la configuración regional lo hago explícitamente.
nyholku

21

Una solución más drástica es configurar su Locale al principio de main ().

Me gusta:

Locale.setDefault(new Locale("en", "US"));

11
Esta es una respuesta muy problemática, porque tiene un efecto global, por lo que puede causar muchos otros cambios (posiblemente indeseables).
sábado

2
En mi opinión, esta es la respuesta correcta a la pregunta y, además, como programador, esto es lo que quiero. Quiero que Java use la configuración regional de EE. UU. De forma predeterminada, ya que en todas partes de mi código donde realmente necesito la localización, lo haré explícito en mi código. Quizás solo sean mis hábitos, pero es muy molesto cuando printf / format usa mi Locale local porque entonces la 'coma' decimal es totalmente incompatible con otro software (Matlab cualquiera) que yo use.
nyholku

10

Puede pasar un Locale adicional a java.lang.String.format así como a java.io.PrintStream.printf (por ejemplo, System.out.printf ()):

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

Esto da como resultado lo siguiente (en mi PC):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

Consulte String.format en la API de Java.


4
También puede usar out.printf((Locale)null, ...)o out.format((Locale)null, ...)para obtener una representación local independiente. (y también hay Locale.ROOT)
eckes

10

Demasiado tarde, pero como se mencionó aquí, se muestra el uso de muestra de NumberFormat(y su subclase DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

Tengo la sensación de que la creación DecimalFormatSymbolsy configuración del separador debe realizarse una vez, antes de este método.
Línea

0

Puede utilizar NumberFormat y DecimalFormat.

Eche un vistazo a este enlace de Java Tutorials LocaleSpecific Formatting

La sección titulada Formato sensible a la configuración regional es lo que necesita.


-3

Tuve el mismo problema ... 55.1transformado a 55,10. Mi solución rápida (¿sucia?) Es:

String.format("%.2f", value).replaceAll(",",".");


1
Eso funciona solo hasta que alguien intente ejecutar su código en una configuración regional diferente. No es una solución real. -1
Marco Freudenberger
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.