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?

dtech
fuente
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.

Jon Skeet
fuente
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"));
Federico Giorgi
fuente
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.

Simon A. Eugster
fuente
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);
 }
VizGhar
fuente
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.

blong824
fuente
-3

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

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

Fred '
fuente
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