.NET String.Format () para adicionar vírgulas em milhares de lugares para um número


852

Quero adicionar uma vírgula na casa dos milhares para um número.

String.Format()?

Respostas:


1216
String.Format("{0:n}", 1234);  // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876

39
String.Format("{0:#,##0}", 1234);também funciona sem casas decimais.
Greg Bray

9
Como posso replicar o especificador "N", mas com o número de dígitos decimais presentes no número?
Stephen Drew

56
@ Justin: De acordo com msdn.microsoft.com/en-us/library/0c899ak8.aspx , o ',' (e o '.') São substituídos pelos caracteres localizados corretos.
Roger Lipscombe

@RogerLipscombe eu não tinha percebido isso #
Justin

6
@VVVV - provavelmente você está passando uma string em vez de um número . Se você tem uma string, primeiro precisa converter para flutuar ou dobrar. Tentestring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

379

Eu achei que essa era a maneira mais simples:

myInteger.ToString("N0")

1
Você também pode usá-lo com string.Format, como em string.Format ( "Aqui é um número com vírgulas e sem decimais, {0: N0}", 123456789 (;
Dan Morphis

16
não deveria ser myInteger.ToString ("N0") ... string.tostring Eu não acho que funcionaria.
Taylor Brown

1
Eu sei que já faz 5 anos, mas obrigado! Funciona para números> 4 caracteres e <4 caracteres.
AskYous

@AskYous - Bem, também funciona para 4 caracteres. É melhor dizer que funciona para qualquer tamanho.
Broots Waymb

Isso está funcionando mas está mudando em configurações regionais
saulyasar

149
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000

27
Essa solução não é boa do ponto de vista da internacionalização - outras culturas usam caracteres diferentes do ,separador de milhares, por exemplo, um espaço ou até mesmo ..
Justin

6
Funciona graças a + 1. Estenderam, então mostra até 2 dp number.ToString ("#, ## 0. ##"))
Crab Bucket

8
@MacSigler Na verdade, não é verdade, veja o comentário de Roger Lipscombe na resposta acima: String.Format aplicará a localização automaticamente.
Dan Bechard

10
@ MacSigler Essa é a questão, porém, esse código nem sempre imprime uma vírgula. Somente quando a cultura espera vírgulas (por exemplo, en-US ou invariante). Se a cultura é aquela que espera outro separador (por exemplo .), o .NET substituirá automaticamente a vírgula por esse separador. Mais uma vez, peço que você leia o link postado por Roger, se ainda não entende o motivo.
precisa

4
@MacSigler O comentário de Justin ainda está correto, pois se você não forçar explicitamente a cultura a entrar nos EUA, herdará as configurações de cultura da máquina local. Meu entendimento é que compilar o código acima e executá-lo em duas máquinas com culturas diferentes (com separadores de números diferentes) produziriam resultados diferentes. Se você deseja que ela sempre produza uma vírgula, é necessário definir explicitamente uma cultura que use a vírgula (por exemplo, invariável).
precisa

98

Se você deseja uma cultura específica, tente:

(19950000.0).ToString("N",new CultureInfo("en-US")) = 19.950.000,00

(19950000.0).ToString("N",new CultureInfo("is-IS")) = 19.950.000,00

Nota: Algumas culturas ,costumam significar decimal, em vez de .ter cuidado.


77

Formatos padrão, com suas saídas relacionadas,

Console.WriteLine("Standard Numeric Format Specifiers");
String s = String.Format("(C) Currency: . . . . . . . . {0:C}\n" +
                    "(D) Decimal:. . . . . . . . . {0:D}\n" +
                    "(E) Scientific: . . . . . . . {1:E}\n" +
                    "(F) Fixed point:. . . . . . . {1:F}\n" +
                    "(G) General:. . . . . . . . . {0:G}\n" +
                    "    (default):. . . . . . . . {0} (default = 'G')\n" +
                    "(N) Number: . . . . . . . . . {0:N}\n" +
                    "(P) Percent:. . . . . . . . . {1:P}\n" +
                    "(R) Round-trip: . . . . . . . {1:R}\n" +
                    "(X) Hexadecimal:. . . . . . . {0:X}\n",
                    - 1234, -1234.565F);
Console.WriteLine(s);

Exemplo de saída (cultura en-us):

(C) Currency: . . . . . . . . ($1,234.00)
(D) Decimal:. . . . . . . . . -1234
(E) Scientific: . . . . . . . -1.234565E+003
(F) Fixed point:. . . . . . . -1234.57
(G) General:. . . . . . . . . -1234
    (default):. . . . . . . . -1234 (default = 'G')
(N) Number: . . . . . . . . . -1,234.00
(P) Percent:. . . . . . . . . -123,456.50 %
(R) Round-trip: . . . . . . . -1234.565
(X) Hexadecimal:. . . . . . . FFFFFB2E

2
Essa resposta trouxe muitas informações úteis. Aprendendo pelo exemplo, vejo agora o que 0 e 1 significam no formato de string.
precisa saber é o seguinte

41

Este é o melhor formato. Funciona em todos os casos:

String.Format( "{0:#,##0.##}", 0 ); // 0
String.Format( "{0:#,##0.##}", 0.5 ); // 0.5 - some of the formats above fail here. 
String.Format( "{0:#,##0.##}", 12314 ); // 12,314
String.Format( "{0:#,##0.##}", 12314.23123 ); // 12,314.23
String.Format( "{0:#,##0.##}", 12314.2 ); // 12,314.2
String.Format( "{0:#,##0.##}", 1231412314.2 ); // 1,231,412,314.2

1
E se eu quiser pontos como separador de milhar e vírgula como delimitador decimal?
precisa saber é o seguinte

upvoted porque não exibir 12,314.0 (como o formato n1), mas 12.314 :)
NDUF

34
String.Format("{0:#,###,###.##}", MyNumber)

Isso lhe dará vírgulas nos pontos relevantes.


10
O método ": n" é melhor, pois deve respeitar a localidade do usuário.
Torlack 19/09/08

12
Isso é verdade, mas não é garantido que você tenha vírgulas no ponto mil, porque respeita a localidade do usuário.
Stephen Wrighton 19/09/08

2
de volta para você: isso é verdade, mas não é garantido que respeite a localidade do usuário porque ela usa vírgulas como separador de milhares. (Por exemplo, em Portugal, a vírgula é, em vez disso, o separador decimal.)
ANeves

1
Se você deseja aplicar valores após o. você precisa substituir o # por 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : Zero substitui o zero pelo dígito correspondente, se houver um; caso contrário, zero aparecerá na sequência de resultados, enquanto o símbolo "#" será substituído pelo dígito correspondente, se houver um; caso contrário, nenhum dígito aparecerá na sequência de resultados.
Clarice Bouwer

esse método funcionou bem para o meu requisito, a página msdn sobre o método Int32.ToString que seria o local principal em que seria usado msdn.microsoft.com/en-us/library/8wch342y.aspx não é muito útil para esse problema. aplicação quer
stackuser83

33

A resposta mais votada foi ótima e é útil há cerca de 7 anos. Com a introdução do C # 6.0 e, especificamente, a Interpolação de cadeias, existe uma maneira mais limpa e, mais segura da IMO, de fazer o que foi solicitado to add commas in thousands place for a number:

var i = 5222000;
var s = $"{i:n} is the number"; // results to > 5,222,000.00 is the number
s = $"{i:n0} has no decimal"; // results to > 5,222,000 has no decimal

Onde a variável i é colocada no lugar do espaço reservado (ou seja {0}). Portanto, não há necessidade de lembrar qual objeto vai para qual posição. A formatação (ou seja :n) não mudou. Para um recurso completo das novidades, você pode acessar esta página .


29

Simples assim:

float num = 23658; // for example 
num = num.ToString("N0"); // Returns 23,658

mais informações estão aqui


21

Se você deseja forçar um separador "," independentemente da cultura (por exemplo, em uma mensagem de rastreamento ou log), o código a seguir funcionará e terá o benefício adicional de informar ao próximo cara que o encontra exatamente o que está fazendo.

int integerValue = 19400320; 
string formatted = string.Format(CultureInfo.InvariantCulture, "{0:N0}", integerValue);

conjuntos formatados para "19.400.320"


21

O exemplo a seguir exibe vários valores formatados usando seqüências de caracteres personalizadas que incluem zero espaços reservados.

String.Format("{0:N1}", 29255.0);

Ou

29255.0.ToString("N1")

resultado "29.255,0"

String.Format("{0:N2}", 29255.0);

Ou

29255.0.ToString("N2")

resultado "29.255,00"


resposta legal, mas e quanto a 29.255,00?
Roxy'Pro

@ Roxy'Pro Alterar a localidade / cultura?
Maarten Bodewes

@MaartenBodewes eu pensei que não é correspondente carta como "N1", "F1" ou smth assim =) Mas chaning cultura iria trabalhar definatelly ..
Roxy'Pro

11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));

3
Ou Console.WriteLine ("{0: #, #}", num); se você quiser apenas imprimi-lo. Mas string.Format (...) é mais útil, eu acho.
Indy9000

11

Mais simples, usando interpolação de string em vez de String.Format

 $"{12456:n0}"; // 12,456
 $"{12456:n2}"; // 12,456.00

ou usando yourVariable

 double yourVariable = 12456.0;
 $"{yourVariable:n0}"; 
 $"{yourVariable:n2}"; 

9

Por exemplo String.Format("{0:0,0}", 1); retorna 01, para mim não é válido

Isso funciona para mim

19950000.ToString("#,#", CultureInfo.InvariantCulture));

produção 19.950.000


8

Observe que o valor que você está formatando deve ser numérico. Não parece que será necessária uma representação em seqüência de um número e o formato é com vírgulas.



5

O C # 7.1 (talvez mais cedo?) Torna isso o mais fácil e bonito possível, com interpolação de string:

var jackpot = 1000000;
var niceNumberString = $"Jackpot is {jackpot:n}";
var niceMoneyString = $"Jackpot is {jackpot:C}";

3

Você pode usar uma função como esta para formatar números e, opcionalmente, passar nas casas decimais desejadas. Se as casas decimais não forem especificadas, serão usadas duas casas decimais.

    public static string formatNumber(decimal valueIn=0, int decimalPlaces=2)
    {
        return string.Format("{0:n" + decimalPlaces.ToString() + "}", valueIn);
    }

Eu uso decimal, mas você pode alterar o tipo para qualquer outro ou usar um objeto anônimo. Você também pode adicionar uma verificação de erro para valores negativos de casas decimais.


-2

O método que eu costumava não me preocupar mais com culturas e possíveis problemas de formatação é que eu o formatei como moeda e depois retirei o símbolo da moeda.

if (decimal.TryParse(tblCell, out result))

{
  formattedValue = result.ToString("C").Substring(1);
}

6
Esse código não é independente da cultura - ele usará qualquer cultura padrão definida na máquina que está executando o código. Isso pode criar uma saída indesejada onde a cultura coloca seus símbolos de moeda no final do número, em vez do início (por exemplo fr-FR), ou usa mais de um caractere para denotar a moeda (por exemplo da-DK), ou não separa milhares usando vírgulas (por exemplo, a maioria da Europa continental).
retornou

-2

Abaixo está uma boa solução em Java!

NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println(fmt.format(n));

ou, de uma maneira mais robusta, convém obter o código de idioma de um local específico e use como abaixo:

int n=9999999;
Locale locale = new Locale("en", "US");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
System.out.println(fmt.format(n));

NOSLocalidade SAÍDA: US $ 9.999.999,00

Saída local alemã

Locale locale = new Locale("de", "DE");

SAÍDA: 9.999.999,00 €

Saída local indiana

Locale locale = new Locale("de", "DE");

SAÍDA: R $ 999.999,00

Saída local da Estônia

Locale locale = new Locale("et", "EE");

SAÍDA: 9 999 999 €

Como você pode ver em diferentes saídas, não precisa se preocupar com o separador como vírgula ou ponto ou mesmo espaço. Você pode obter o número formatado de acordo com os padrões i18n


1
onde você usou a variável locale ??
Smith

bem detectado corretamente, ele pode ser usado para obter a instância da moeda como: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); corrigiu o código, obrigado!
Anirudh

3
Você verificou as tags? A questão é sobre c # não Java!
Salar

-3

Se você deseja mostrá-lo no DataGridview, você deve alterar seu tipo, porque o padrão é String e, como você o altera para decimal, considera como Número com ponto flutuante

Dim dt As DataTable = New DataTable
dt.Columns.Add("col1", GetType(Decimal))
dt.Rows.Add(1)
dt.Rows.Add(10)
dt.Rows.Add(2)

DataGridView1.DataSource = dt
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.