.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()?

Seibar
fonte

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
Seibar
fonte
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")
alquímico
fonte
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
p.campbell
fonte
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.

prabir
fonte
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
CoderTao
fonte
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
Dennis
fonte
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.

Stephen Wrighton
fonte
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 .

von v.
fonte
29

Simples assim:

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

mais informações estão aqui

a_m_dev
fonte
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"

Ravi Desai
fonte
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"

Yitzhak Weinberg
fonte
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));
p.campbell
fonte
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}"; 
brakeroo
fonte
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

cmujica
fonte
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.


fonte
5
String.Format("0,###.###"); also works with decimal places
Abolfazl Rastgou
fonte
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}";
Mark Zhukovsky
fonte
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.

Dunwan
fonte
-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);
}
8 John Volante
fonte
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

Anirudh
fonte
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
Todos
fonte