Formatação decimal dupla em Java


118

Estou tendo alguns problemas para formatar os decimais de um duplo. Se eu tiver um valor duplo, por exemplo, 4.0, como formato os decimais para que seja 4,00?




Respostas:


218

Uma das maneiras seria usar NumberFormat .

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

Resultado:

4,00


1
Sim, mas não quero a vírgula, quero o sinal decimal.
Christoffer,

Estou recebendo uma vírgula. Isso é o que eu fiz. "double variable; NumberFormat formatter = new DecimalFormat (" # 0,00 "); System.out.println (formatter.format (variable));
Christoffer,

a saída para isso é X, 00 e não X.00
Christoffer,

9
Você está recebendo uma vírgula por causa do idioma padrão usado pelo seu JVM, que provavelmente é diferente do Nambari. Dê uma olhada em NumberFormat javadoc: docs.oracle.com/javase/1.4.2/docs/api/java/text/…
Michael Zilbermann,

1
Como apontou zim2001, sua localidade pode ser diferente. Leia o link fornecido em minha resposta. No final você encontrará informações sobre isso.
kosa,

73

Com o Java 8, você pode usar o formatmétodo ..: -

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

System.out.printf("%.2f", 4.0); 
  • fé usado para floatingvalor em pontos ..
  • 2 após decimal denota, número de casas decimais após .

Para a maioria das versões Java, você pode usar DecimalFormat: -

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

43

Use String.format :

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

De acordo com os documentos:

O local sempre usado é aquele retornado por Locale.getDefault().


8
String.format também aceita uma localidade como o primeiro parâmetro para considerar a formatação do sinal decimal.
Vincent Mimoun-Prat,

4
Para evitar sinais decimais específicos da localidade (como uma vírgula), especifique a localidade dos EUA: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233,

3
Eu diria "para usar um ponto específico da localidade dos EUA como um sinal decimal, especifique a localidade dos EUA" .. essa ideia de que os hábitos dos EUA são os corretos e tudo o mais é tipo "folk" me deixa louco.
Simone Gianni

@SimoneGianni Não faça suposições estúpidas, algumas pessoas podem precisar que o decimal seja um ponto. Por exemplo, estou escrevendo uma função que exporta um documento CSV e não posso ter uma vírgula porque o caractere de vírgula é o delimitador.
Kaiser Keister

19

Usando String.format, você pode fazer isso:

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

Observe a vírgula que torna isso diferente da resposta de @ Vincent

Resultado:

$52,000.00

Um bom recurso para formatação é a página java oficial sobre o assunto


6

Você sempre pode usar o método estático printf from System.out- você então implementa o formatador correspondente; isso economiza espaço de heap no qual outros exemplos exigiam que você fizesse.

Ex:

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

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

Economiza espaço de heap, o que é um grande bônus, no entanto, eu tenho a opinião de que este exemplo é muito mais gerenciável do que qualquer outra resposta, especialmente porque a maioria dos programadores conhece a função printf do C (o Java muda ligeiramente a função / método).


1
@Baz Estou faltando um detalhe crucial aqui, não há nenhum printStream mencionado. O OP está pedindo ajuda na formatação (o que poderia ser resolvido mais facilmente examinando os documentos Java) para o fluxo de saída padrão. Explicar.
Lewis Robbins,

Foi mal. Estava olhando para a versão errada do javadoc (1.4). BTW: outé o PrintStream.
Baz,

@Baz Não se preocupe. Sim, presumi que essa é a classe à qual você estava se referindo, em todos os meus livros printf é referido como o método estático do System.out (já que esses métodos são estáticos).
Lewis Robbins,

1
Para ser exato, printfé um método estático de PrintStream. Veja aqui ;) Mas +1, no entanto.
Baz,

@Baz Dos documentos, a classe printStream herdou System.out. Talvez eu possa estar errado - embora seja muito estranho herdar um método estático (é mesmo possível)? Você está, eu espero correto embora.
Lewis Robbins,

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


1

Um método alternativo é usar o setMinimumFractionDigitsmétodo da NumberFormatclasse.

Aqui, você basicamente especifica quantos números deseja que apareçam após o ponto decimal.

Portanto, uma entrada de 4.0produziria 4.00, supondo que o valor especificado fosse 2.

Mas, se sua Doubleentrada contiver mais do que o valor especificado, levará o valor mínimo especificado e, em seguida, adicionará mais um dígito arredondado para cima / para baixo

Por exemplo, 4.15465454com uma quantidade mínima de 2 especificados produzirá4.155

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

Experimente online


1

Existem muitas maneiras de fazer isso. Esses são dados abaixo:

Suponha que seu número original seja fornecido abaixo:

 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 e padrão:

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

Usando DecimalFormat e padrão

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

Em todos os casos, a saída será: 2354548,23

Nota :

Durante o arredondamento, você pode adicionar RoundingModeseu formatador. Aqui estão alguns modos de arredondamento fornecidos abaixo:

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

Aqui estão as importações :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

Você pode usar qualquer um dos métodos abaixo

  1. Se você estiver usando java.text.DecimalFormat

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

    OU

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Se você quiser convertê-lo em formato de string simples

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

Todo o código acima imprimirá 4,00


0

Funciona 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

Primeira importação NumberFormat. Em seguida, adicione este:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

Isso dará a você duas casas decimais e colocará um cifrão se for para moeda.

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
A questão não é sobre como exibir uma moeda e é respondida com mais precisão usando funções de formatação) como descrito em outras respostas).
yacc

-4

Você pode fazer isso da seguinte maneira:

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

1
Não funciona porque está usando em ##vez de00
Joaquin Iurchuk

-4

Eu sei que este é um tópico antigo, mas se você realmente gosta de ter o ponto em vez da vírgula, apenas salve seu resultado como X, 00 em uma String e simplesmente altere por um ponto para obter X.00

A maneira mais simples é usar substituir.

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

A saída será o X.00 desejado. Além disso, para facilitar, você pode fazer tudo de uma vez e salvá-lo em uma variável dupla:

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

Eu sei que esta resposta não é útil agora, mas talvez alguém que verifique este fórum esteja procurando uma solução rápida como esta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.