String.format () para formatear double en java

178

¿Cómo puedo usar String.format (format String, X) para formatear un doble como sigue?

2354548.235 -> 2,354,548.23

¡Gracias!

pozo
fuente

Respuestas:

295
String.format("%1$,.2f", myDouble);

String.format usa automáticamente la configuración regional predeterminada.

David Tang
fuente
36
También puede usar una configuración regional específica usandoString.format(Locale.GERMAN, "%1$,.2f", myDouble);
Olivier Grégoire
13
Si hay más de un doble para formatear, use% 1,% 2, y así sucesivamente. Por ejemplo String.format ("% 1 $ ,. 2f,% 2 $ ,. 2f", myDouble, aDouble)
Moesio
44
Creo que el "% 1 $" es opcional en este caso. Funciona para mí con solo "% ,. 2f" como el formato de cadena.
Matt Passell el
55
Sí, Matt tiene razón. %1, %2y así sucesivamente se puede utilizar para reordenar la salida en función del índice de sus argumentos de entrada. Mira esto . Puede omitir el índice y el formateador asumirá el orden predeterminado.
praneetloke
1
Debe dar una explicación de lo que significan las diferentes partes.
Mitulát báti
41
String.format("%4.3f" , x) ;

Significa que necesitamos un total de 4 dígitos en ans, de los cuales 3 deben ser después del decimal. Y f es el especificador de formato de doble. x significa la variable para la que queremos encontrarlo. Trabajó para mi . . .

usuario3304797
fuente
1
Creo que significa que será la cuarta variable en los argumentos que siguen y tendrá 3 lugares después del decimal.
Michael Fulton
@MichaelFulton No es tan fácil: String.format("%014.3f" , 58.656565)-> 0000000058,657: 14 símbolos en total: 8 ceros y 5 números y 1 coma. Entonces, en este caso, número 14 significa el número total de símbolos (los adicionales se reemplazan con cero a la izquierda, podrían ir sin, luego se reemplazarían con espacio) en la cadena de resultados . La .3parte es completamente independiente aquí.
analizador
Sin embargo aquí: String.format("%014.3f" , 58.656565)-> 58,657. Lo tomo porque la preferencia va a la .3fparte: primero imprime el número con 3 decimales y luego, si quedan símbolos , imprime los espacios iniciales (o ceros / lo que sea). En este caso, el número es 2 + 3 + 1 = 6 símbolos y solo queríamos imprimir 4, por lo que ciertamente no hay espacios adicionales.
analizador
24

Si desea formatearlo con símbolos establecidos manualmente, use esto:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);
System.out.println(decimalFormat.format(1237516.2548)); //1,237,516.25

Sin embargo, se prefiere el formato basado en la configuración regional.

mdrg
fuente
3
Respuesta útil! Sin embargo, la última oración "Sin embargo, se prefiere el formato basado en la configuración regional" no tiene sentido sin contexto. Hay casos de uso bastante buenos en los que NO debe usar el formato basado en la configuración regional, cuando desea generar un formato específico de la Cadena. Por ejemplo, está implementando la exportación de sus datos a un archivo externo y desea tener un control total sobre el formato, sin depender de la configuración regional actual (o alguna).
Honza Zidek
20

código extraído de este enlace ;

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + 
                   currentLocale.toString());

El resultado de este ejemplo muestra cómo varía el formato del mismo número con la configuración regional:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US
Gursel Koca
fuente
13
public class MainClass {
   public static void main(String args[]) {
    System.out.printf("%d %(d %+d %05d\n", 3, -3, 3, 3);

    System.out.printf("Default floating-point format: %f\n", 1234567.123);
    System.out.printf("Floating-point with commas: %,f\n", 1234567.123);
    System.out.printf("Negative floating-point default: %,f\n", -1234567.123);
    System.out.printf("Negative floating-point option: %,(f\n", -1234567.123);

    System.out.printf("Line-up positive and negative values:\n");
    System.out.printf("% ,.2f\n% ,.2f\n", 1234567.123, -1234567.123);
  }
}

E imprima:

3 (3) +3 00003
Formato de punto flotante predeterminado: 1234567,123000 Punto
flotante con comas: 1.234.567,123000
Valor predeterminado de punto
flotante negativo : -1.234.567,123000 Opción de punto flotante negativo: (1.234.567, 123000)

Alineación de valores positivos y negativos:
1.234.567,12
-1.234.567,12

Torres
fuente
2

Hay muchas formas de hacer esto. Esos se dan a continuación:

Suponga que su número original se muestra a continuación: número doble = 2354548.235;

Uso NumberFormaty modo de redondeo

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
    DecimalFormat decimalFormatter = (DecimalFormat) nf;
    decimalFormatter.applyPattern("#,###,###.##");
    decimalFormatter.setRoundingMode(RoundingMode.CEILING);

    String fString = decimalFormatter.format(number);
    System.out.println(fString);

Usando el formateador de cadenas

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

En todos los casos el resultado será: 2354548.24

Nota :

Durante el redondeo puede agregar RoundingModesu formateador. Aquí hay algunos modos de redondeo dados a continuación:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

Aquí están las importaciones :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
MD Sajedul Karim
fuente
1

Utilizar DecimalFormat

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