¿Cómo puedo formatear un número de cadena para tener comas y redondear?

142

¿Cuál es la mejor manera de formatear el siguiente número que se me da como una cadena?

String number = "1000500000.574" //assume my value will always be a String

Quiero que esto sea una cadena con el valor: 1,000,500,000.57

¿Cómo puedo formatearlo como tal?

Sheehan Alam
fuente

Respuestas:

256

Es posible que desee mirar la DecimalFormatclase; admite diferentes configuraciones regionales (por ejemplo, en algunos países que se formatearían como en su 1.000.500.000,57lugar).

También necesita convertir esa cadena en un número, esto se puede hacer con:

double amount = Double.parseDouble(number);

Código de muestra:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));
NullUserException
fuente
¿Puedes mostrar un ejemplo de cómo puedo usar NumberFormat con este caso en particular?
Sheehan Alam
1
también puede usar la siguiente solución: cadena estática pública getRoundOffValue (valor doble) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); devuelve df.format (valor); }
Jitendra Nath
También prefiero el cero antes del punto como DecimalFormat formatter = new DecimalFormat ("#, ## 0.00"); - obtener .00 por cero me parece mal
Leo
45

Esto también se puede lograr usando String.format (), que puede ser más fácil y / o más flexible si está formateando múltiples números en una cadena.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

Para la cadena de formato "% ,. 2f" - "," significa grupos de dígitos separados con comas, y ".2" significa redondear a dos lugares después del decimal.

Para obtener referencias sobre otras opciones de formato, consulte https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Greg H
fuente
42

Una vez que haya convertido su cadena en un número, puede usar

// format the number for the default locale
NumberFormat.getInstance().format(num)

o

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)
Aaron Novstrup
fuente
¿Cómo especificar la configuración regional y redondear a (por ejemplo) 2 decimales?
Jonik
66
Ah, no importa, lo encontré:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
Jonik
16

Dado que este es el resultado número uno de Google format number commas java, aquí hay una respuesta que funciona para las personas que trabajan con números enteros y no les importan los decimales.

String.format("%,d", 2000000)

salidas:

2,000,000
Ben Watson
fuente
también funciona para flotantes, por ejemplo, printf ("%, f \ n", decimalNumber)
philwalk
12

He creado mi propia utilidad de formateo. Lo cual es extremadamente rápido en el procesamiento del formato junto con muchas características :)

Soporta:

  • Formato de coma Por ejemplo, 1234567 se convierte en 1,234,567.
  • Prefijo con "Mil (K), Millones (M), Mil millones (B), Trillones (T)".
  • Precisión de 0 a 15.
  • Cambio de tamaño de precisión (significa si desea una precisión de 6 dígitos, pero solo tiene 3 dígitos disponibles, lo obliga a 3).
  • Reducción de prefijo (significa que si el prefijo que elige es demasiado grande, lo reduce a un prefijo más adecuado).

El código se puede encontrar aquí . Lo llamas así:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

También debo señalar que esto no maneja el soporte decimal, pero es muy útil para valores enteros. El ejemplo anterior mostraría "1.23M" como salida. Probablemente podría agregar soporte decimal tal vez, pero no vi demasiado uso desde entonces, entonces podría fusionar esto en un tipo de clase BigInteger que maneja matrices char [] comprimidas para cálculos matemáticos.

Jeremy Trifilo
fuente
2
Esto es bueno si solo trabajas en inglés. Mi sugerencia es evitar algo así como molestar la cena de mis usuarios que no están en inglés, ya que no podían entender qué Ko qué Msignifica
rishabhmhjn
@rishabhmhjn pero ... ¿no podrías modificarlo para modificarlo a cualquier letra que necesites? ¿Es tu mala suerte su culpa? : oy lo que creó es bastante bueno, a pesar de que el enlace parece no estar disponible en este momento ..
Aquarius Power
@AquariusPower el problema es, por ejemplo, los números japoneses no siguen el sistema métrico. Sus números son como 1 百 por 100, 1 千 por 1000, 1 万 por 10000, luego se convierte en 1 千万 por 1000,0000. Mi equipo estaba trabajando en algo similar en Javascript. Puede usar la lógica mencionada en este: github.com/statusbrew/angular-bignumber
rishabhmhjn
Encontré mi antiguo código para esto, así que lo volví a cargar en GitHub. El enlace en el comentario ha sido actualizado.
Jeremy Trifilo
6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}
usuario3314142
fuente
6

También puede usar la siguiente solución:

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}
Jitendra Nath
fuente
4

Puede realizar la conversión completa en una línea, utilizando el siguiente código:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

Los dos últimos signos # en el constructor DecimalFormat también pueden ser 0s. De cualquier manera funciona.

Peter Griffin
fuente
3

La primera respuesta funciona muy bien, pero para CERO / 0 se formateará como .00

Por lo tanto, el formato #, ## 0.00 está funcionando bien para mí. Siempre pruebe diferentes números como 0/100 / 2334.30 y números negativos antes de implementar en el sistema de producción.

Venod Raveendran
fuente
3

Aquí está la forma más sencilla de llegar allí:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

salida: 10,987,655.88

John Paker
fuente