Como posso formatar um número de String para ter vírgulas e arredondar?


142

Qual é a melhor maneira de formatar o seguinte número que me é dado como uma String?

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

Eu quero que isso seja uma String com o valor: 1,000,500,000.57

Como posso formatá-lo como tal?

Respostas:


256

Você pode querer olhar para a DecimalFormatclasse; suporta localidades diferentes (por exemplo: em alguns países que seriam formatados como1.000.500.000,57 alternativa).

Você também precisa converter essa sequência em um número, isso pode ser feito com:

double amount = Double.parseDouble(number);

Exemplo de código:

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

System.out.println(formatter.format(amount));

você pode mostrar um exemplo de como eu posso usar NumberFormat nesse caso específico?
Sheehan Alam

1
você também pode usar a solução abaixo - public static String getRoundOffValue (valor duplo) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); retornar df.format (valor); }
Jitendra Nath

Eu também prefiro o zero antes do ponto, como o formatador DecimalFormat = new DecimalFormat ("#, ## 0.00"); - obter 0,00 para zero parece errado para mim #
1010 Leo

45

Isso também pode ser realizado usando String.format (), que pode ser mais fácil e / ou mais flexível se você estiver formatando vários números em uma sequência.

    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 a sequência de formato "%, 2f" - "," significa separar grupos de dígitos com vírgulas e ".2" significa arredondar para duas casas após o decimal.

Para referência sobre outras opções de formatação, consulte https://docs.oracle.com/javase/tutorial/java/data/numberformat.html


42

Depois de converter sua String em um número, você pode usar

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

ou

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

Como especificar localidade e arredondar para (digamos) 2 casas decimais?
Jonik

6
Ah, deixa new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
pra

16

Dado que este é o resultado número um do Google format number commas java, aqui está uma resposta que funciona para pessoas que trabalham com números inteiros e não se importam com decimais.

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

saídas:

2,000,000

também funciona para carros alegóricos, por exemplo, printf ("%, f \ n", decimalNumber) #
philwalk

12

Eu criei meu próprio utilitário de formatação. O que é extremamente rápido no processamento da formatação, além de oferecer muitos recursos :)

Suporta:

  • Formatação de vírgula Por exemplo, 1234567 passa a 1.234.567.
  • Prefixando com "Mil (K), Milhão (M), Bilhão (B), Trilhão (T)".
  • Precisão de 0 a 15.
  • Redimensionamento de precisão (significa se você deseja uma precisão de 6 dígitos, mas só tem 3 dígitos disponíveis, isso obriga a 3).
  • Redução de prefixo (significa que se o prefixo escolhido for muito grande, ele será reduzido para um prefixo mais adequado).

O código pode ser encontrado aqui . Você chama assim:

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

Devo também salientar que isso não lida com suporte decimal, mas é muito útil para valores inteiros. O exemplo acima mostraria "1.23M" como a saída. Provavelmente eu poderia adicionar suporte decimal, talvez, mas não vi muito uso para isso desde então. É melhor mesclar isso em um tipo de classe BigInteger que lida com matrizes char [] compactadas para cálculos matemáticos.


2
Isso é bom se você estiver trabalhando apenas no idioma inglês. Minha sugestão é para evitar tal coisa como ela chateado jantar dos meus usuários não inglês, pois não conseguia entender o que Kou Mmeios
rishabhmhjn

@rishabhmhjn mas ... você não poderia apenas ajustá-lo para modificar qualquer letra que você precisa? a sua má sorte é culpa dele? : oe o que ele criou é bem legal, apesar do link parecer indisponível no momento .. #
Aquarius Power

@AquariusPower, o problema é, por exemplo, os números japoneses não seguem o sistema métrico. Seus números são como 1 百 para 100, 1 1000 para 1000, 1 万 para 10000, então torna-se 1 千万 para 1000,0000. Minha equipe estava trabalhando em algo semelhante em Javascript. Você pode usar a lógica de que trata este um: github.com/statusbrew/angular-bignumber
rishabhmhjn

Encontrei meu código antigo para isso, então eu o reenviei ao GitHub. O link no comentário foi atualizado.
Jeremy Trifilo 6/01/19

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);
}

6

você também pode usar a solução abaixo -

public static String getRoundOffValue(double value){

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

4

Você pode fazer a conversão inteira em uma linha, usando o seguinte código:

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

Os dois últimos # sinais no construtor DecimalFormat também podem ser 0s. De qualquer maneira funciona.


3

A primeira resposta funciona muito bem, mas para o ZERO / 0 ele será formatado como .00

Portanto, o formato #, ## 0.00 está funcionando bem para mim. Sempre teste números diferentes, como 0/100 / 2334.30 e números negativos, antes de implantar no sistema de produção.


3

Aqui está a maneira mais simples de chegar lá:

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

saída: 10.987.655,88

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.