2012-05-02 10 views
14

¿Cómo puedo usar NumberFormat para formatear un valor de double para un Locale dado (la configuración regional predeterminada es suficiente) y para un número dado de lugares decimales?¿Cómo formatear el valor doble para una configuración regional determinada y la cantidad de lugares decimales?

Por ejemplo, tengo estos valores:

double d1 = 123456.78; 
double d2 = 567890; 

y quiero imprimirlos de la siguiente manera, por ejemplo, con Estados Unidos Idioma y 2 decimales:

123,456.78 
567,890.00 

I don' realmente me importa el modo de redondeo en este caso, porque estos valores dobles se obtienen de BigDecimal con la escala determinada, por lo que el número de decimales siempre es menor o igual que el número de decimales que deseo imprimir.

Editar:

Para hacer las cosas un poco más claro, la cosa es que quiero mostrar dinero de una manera dependiente de la localidad, pero con un número fijo de decimales. El ejemplo anterior mostró cómo se deben formatear los valores si la configuración regional del sistema es en_US. Ahora vamos a decir, la región del sistema es cs_CZ (Checa), por lo que los mismos números debe tener el formato de esta manera:

123 456,78 
567 890,00 

Ahora, ¿cómo puedo configurar un NumberFormat para mostrar siempre 2 cifras decimales, pero para mostrar separador de miles y punto decimal basado en la configuración regional actual?

Respuesta

36

Si usted se preocupa de leer la documentación de NumberFormat, la solución obvia sería:

double d1 = 123456.78; 
double d2 = 567890; 
// self commenting issue, the code is easier to understand 
Locale fmtLocale = Locale.getDefault(Category.FORMAT); 
NumberFormat formatter = NumberFormat.getInstance(fmtLocale); 
formatter.setMaximumFractionDigits(2); 
formatter.setMinimumFractionDigits(2); 
System.out.println(formatter.format(d1)); 
System.out.println(formatter.format(d2)); 
System.out.println(fmtLocale.toLanguageTag()); 

En mi máquina imprime esta:

123 456,78
567 890,00
pl-PL

Creo que esto es lo que está buscando, una no tienes que desordenar con los patrones. No haría eso, por ejemplo, hay configuraciones regionales que agrupan dígitos por dos, no por tres (esta es la razón por la que hablamos de separador de agrupación y noseparador de millares).

+0

Muchas gracias – Sayka

+0

@ Paweł Dyda Cómo debo convertir una cadena 123,456.78 en la configuración regional de Estados Unidos a un valor doble 123.456,78? – KJEjava48

3

Se podría utilizar algo como

DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(); 
formatter.applyPattern("#,###,##0.00"); 
formatter.format(yourDoubleHere) 
7

Adaptado de Customizing Formats,

public void localizedFormat(double value,Locale loc) { 

    NumberFormat nf = NumberFormat.getNumberInstance(loc); 
    DecimalFormat df = (DecimalFormat)nf; 
    df.applyPattern("###,###.00"); 
    String output = df.format(value); 

    } 

Esta función debería darle el formato requerido.

0

convierte un valor doble en un valor doble con cualquier número de dígitos después de decimal. He creado este método en una clase de utilidad para acceder a él a través del proyecto.

public static double convertToDecimal(double doubleValue, int numOfDecimals) { 
     BigDecimal bd = new BigDecimal(doubleValue); 
     bd = bd.setScale(numOfDecimals, BigDecimal.ROUND_HALF_UP); 
     return bd.doubleValue(); 
    } 
Cuestiones relacionadas