Formateo de decimal doble en Java


118

Tengo algunos problemas para formatear los decimales de un doble. Si tengo un valor doble, por ejemplo, 4.0, ¿cómo formateo los decimales para que sean 4.00?




Respuestas:


218

Una de las formas sería usar NumberFormat .

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

Salida:

4,00


1
Sí, pero no quiero la coma, quiero un signo decimal.
Christoffer

Tengo una coma. Esto es lo que hice. "double variable; NumberFormat formatter = new DecimalFormat (" # 0.00 "); System.out.println (formatter.format (variable));
Christoffer

la salida para eso es X, 00 y no X.00
Christoffer

9
Obtiene una coma debido al idioma predeterminado que usa su JVM, que probablemente sea diferente de los de Nambari. Eche un vistazo a NumberFormat javadoc: docs.oracle.com/javase/1.4.2/docs/api/java/text/…
Michael Zilbermann

1
Como señaló zim2001, su configuración regional podría ser diferente. Lea el enlace proporcionado en mi respuesta. Al final encontrará información sobre esto.
kosa

73

Con Java 8, puede utilizar el formatmétodo ..: -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • fse utiliza para el floatingvalor en puntos.
  • 2 después de decimal denota, número de lugares decimales después .

Para la mayoría de las versiones de Java, puede utilizar DecimalFormat: -

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));

43

Utilice String.format :

String.format("%.2f", 4.52135);

Según los documentos:

La configuración regional siempre utilizada es la devuelta por Locale.getDefault().


8
String.format también acepta una configuración regional como primer parámetro para tener en cuenta el formato de signo decimal.
Vincent Mimoun-Prat

4
Para evitar signos decimales específicos de la configuración regional (como una coma), especifique la configuración regional de EE. UU.: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233

3
Yo diría "para usar el punto específico de la configuración regional de EE. UU. Como signo decimal, especifique la configuración regional de EE. UU." ... esta idea de que los hábitos de EE. UU. Son los correctos y todo lo demás es algo "popular" me vuelve loco.
Simone Gianni

@SimoneGianni No hagas suposiciones estúpidas, algunas personas pueden necesitar que el decimal sea un punto. Por ejemplo, estoy escribiendo una función que exporta un documento CSV y no puedo tener una coma porque el carácter de la coma es el delimitador.
Kaiser Keister

19

Usando String.format, puede hacer esto:

double price = 52000;
String.format("$%,.2f", price);

Observe la coma que hace que esto sea diferente de la respuesta de @ Vincent

Salida:

$52,000.00

Un buen recurso para formatear es la página oficial de Java sobre el tema.


6

Siempre puede usar el método estático printf from System.out; luego, implementará el formateador correspondiente; esto ahorra mucho espacio en el que otros ejemplos requieren que lo haga.

Ex:

System.out.format("%.4f %n", 4.0); 

System.out.printf("%.2f %n", 4.0); 

Ahorra espacio en el montón, lo cual es una gran ventaja, sin embargo, tengo la opinión de que este ejemplo es mucho más manejable que cualquier otra respuesta, especialmente porque la mayoría de los programadores conocen la función printf de C (aunque Java cambia ligeramente la función / método).


1
@Baz ¿Me estoy perdiendo un detalle crucial aquí? No se menciona printStream. El OP solicita ayuda para formatear (que podría resolverse más fácilmente mirando los documentos de Java) para el flujo de salida estándar. Explique.
Lewis Robbins

Culpa mía. Estaba viendo la versión de javadoc incorrecta (1.4). Por cierto: outes el PrintStream.
Baz

@Baz No te preocupes. Sí, asumí que esa es la clase a la que te referías, en todos mis libros se hace referencia a printf como el método estático de System.out (ya que esos métodos son estáticos).
Lewis Robbins

1
Para ser exactos, printfes un método estático de PrintStream. Ver aquí ;) Pero +1 de todos modos.
Baz

@Baz De los documentos, la clase printStream heredó System.out. Quizás podría estar equivocado, aunque es bastante extraño heredar un método estático (¿es posible)? Sin embargo, espero que sea correcto.
Lewis Robbins

4
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));


1

Un método alternativo es utilizar el setMinimumFractionDigitsmétodo delNumberFormat clase.

Aquí, básicamente, especifica cuántos números desea que aparezcan después del punto decimal.

Entonces, una entrada de 4.0produciría4.00 , asumiendo que la cantidad especificada fuera 2.

Pero, si tu Double entrada contiene más de la cantidad especificada, tomará la cantidad mínima especificada, luego agregará un dígito más redondeado hacia arriba / hacia abajo

Por ejemplo, 4.15465454con una cantidad mínima de 2 especificada se producirá4.155

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

Pruébelo en línea


1

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

Suponga que su número original se da a continuación:

 double number = 2354548.235;

Usando NumberFormat:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

Usando String.format:

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

Usando DecimalFormat y patrón:

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

Usando DecimalFormat y patrón

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

En todos los casos la salida será: 2354548.23

Nota :

Durante el redondeo, puede agregar RoundingModesu formateador. A continuación, se muestran algunos modos de redondeo:

    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;

1

Puede utilizar cualquiera de los métodos siguientes

  1. Si esta usando java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));

    O

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Si desea convertirlo en formato de cadena simple

    System.out.println(String.format("%.2f", 4.0)); 

Todo el código anterior imprimirá 4.00


0

Funciona al 100%.

import java.text.DecimalFormat;

public class Formatting {

    public static void main(String[] args) {
        double value = 22.2323242434342;
        // or  value = Math.round(value*100) / 100.0;

        System.out.println("this is before formatting: "+value);
        DecimalFormat df = new DecimalFormat("####0.00");

        System.out.println("Value: " + df.format(value));
    }

}

-3

Primera importación NumberFormat. Luego agrega esto:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

Esto le dará dos lugares decimales y pondrá un signo de dólar si se trata de moneda.

import java.text.NumberFormat;
public class Payroll 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
    int hoursWorked = 80;
    double hourlyPay = 15.52;

    double grossPay = hoursWorked * hourlyPay;
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
    }

}

1
La pregunta no se trata de mostrar una moneda y se responde con mayor precisión mediante el uso de funciones de formato (como se describe en otras respuestas).
yacc

-4

Puedes hacerlo de la siguiente manera:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

1
No funciona porque está usando en ##lugar de00
Joaquin Iurchuk

-4

Sé que este es un tema antiguo, pero si realmente desea tener el punto en lugar de la coma, simplemente guarde su resultado como X, 00 en una cadena y luego simplemente cámbielo por un período para obtener el X.00

La forma más sencilla es usar reemplazar.

String var = "X,00";
String newVar = var.replace(",",".");

La salida será la X.00 que deseaba. Además, para que sea más fácil, puede hacerlo todo a la vez y guardarlo en una variable doble:

Double var = Double.parseDouble(("X,00").replace(",",".");

Sé que esta respuesta no es útil en este momento, pero tal vez alguien que consulte este foro esté buscando una solución rápida como esta.

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.