.NET String.Format () per aggiungere virgole in migliaia al posto di un numero


852

Voglio aggiungere una virgola tra le migliaia per un numero.

String.Format()?

Risposte:


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);funziona anche senza decimali.
Greg Bray,

9
Come posso replicare l'identificatore "N" ma con tutte le cifre decimali presenti nel numero?
Stephen Drew il

56
@Justin: Secondo msdn.microsoft.com/en-us/library/0c899ak8.aspx~~V~~singular~~3rd , the '' ( '' e) vengono sostituiti con i caratteri localizzati corretti.
Roger Lipscombe,

@RogerLipscombe Non me ne ero reso conto
Justin

6
@VVVV - probabilmente stai passando una stringa anziché un numero . Se hai una stringa, devi prima convertirla in float o double. Provastring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

379

Ho trovato questo per essere il modo più semplice:

myInteger.ToString("N0")

1
Puoi anche usarlo con string.Format, come in string.Format ("Ecco un numero con virgole e senza decimali, {0: N0}", 123456789 (;
Dan Morphis,

16
non dovrebbe essere myInteger.ToString ("N0") ... string.tostring non credo funzionerebbe.
Taylor Brown,

1
So che sono passati 5 anni, ma grazie! Funziona con numeri> 4 caratteri e <4 caratteri.
AskYous,

@AskYous - Beh, funziona anche per 4 personaggi .. Potrebbe anche dire che funziona per qualsiasi lunghezza.
Broots Waymb,


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

27
Questa soluzione non è buona dal punto di vista dell'internazionalizzazione: altre culture usano caratteri diversi ,da un separatore di migliaia, ad esempio uno spazio o addirittura ..
Justin,

6
Funziona grazie + 1. Ho esteso, quindi mostra fino a 2 dp number.ToString ("#, ## 0. ##")
Buckb Bucket

8
@MacSigler In realtà non è vero, vedi il commento di Roger Lipscombe sulla risposta sopra: String.Format applicherà la localizzazione automaticamente.
Dan Bechard,

10
@MacSigler Questo è il punto, questo codice non sempre stampa una virgola. Solo quando la cultura è quella che prevede le virgole (ad es. En-US o invariante). Se la cultura è quella che prevede un altro separatore (ad esempio .), .NET sostituirà automaticamente la virgola con quel separatore. Ancora una volta, ti esorto a leggere il link pubblicato da Roger se ancora non capisci perché.
Dan Bechard,

4
@MacSigler Il commento di Justin è ancora corretto in quanto se non costringi esplicitamente la cultura a entrare negli Stati Uniti, erediterà le impostazioni della cultura dal computer locale. La mia comprensione è che compilare il codice sopra, quindi eseguirlo su due macchine con culture diverse (con separatori di numeri diversi) produrrebbe risultati diversi. Se si desidera che produca sempre una virgola, è necessario impostare esplicitamente una cultura che utilizza la virgola (ad esempio invariante).
Dan Bechard,

98

Se vuoi una cultura specifica, potresti provare questo:

(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: alcune culture usano ,per indicare i decimali piuttosto che .fare attenzione.


77

Formati standard, con relativi output,

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

Esempio di output (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
Questa risposta conteneva molte informazioni utili. Imparando dall'esempio, vedo ora cosa significano 0 e 1 nel formato stringa.
user420667,

41

Questo è il formato migliore. Funziona in tutti questi casi:

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
Cosa succede se desidero punti come separatore delle migliaia e virgola come delimitatore decimale?
FrenkyB,

votato perché non visualizza 12.314,0 (come il formato n1) ma 12.314 :)
NDUF

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

Questo ti darà le virgole nei punti pertinenti.


10
Il metodo ": n" è migliore poiché dovrebbe rispettare le impostazioni internazionali dell'utente.
Torlack,

12
Questo è vero, ma non è garantito che ti dia virgole a migliaia di punti perché rispetta le impostazioni locali dell'utente.
Stephen Wrighton,

2
di nuovo a te: è vero, ma non è garantito il rispetto delle impostazioni locali dell'utente perché utilizza le virgole come separatore delle migliaia. (Ad esempio, in Portogallo la virgola è invece il separatore decimale.)
ANeves

1
Se si desidera applicare valori dopo il. è necessario sostituire il # con uno 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : Zero sostituisce lo zero con la cifra corrispondente se presente; altrimenti, nella stringa del risultato viene visualizzato zero mentre il simbolo "#" viene sostituito con la cifra corrispondente se presente; in caso contrario, nessuna cifra appare nella stringa del risultato.
Clarice Bouwer,

questo metodo ha funzionato bene per il mio requisito, la pagina msdn sul metodo Int32.ToString che sarebbe un posto primario che sarebbe usato msdn.microsoft.com/en-us/library/8wch342y.aspx non è molto utile per questo particolare applicazione sia
stackuser83

33

La risposta più votata è stata ottima ed è stata utile per circa 7 anni. Con l'introduzione di C # 6.0 e in particolare dell'interpolazione di stringhe c'è un modo più ordinato e, più sicuro dell'IMO, di fare ciò che è stato chiesto 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

Dove la variabile i viene messa al posto del segnaposto (cioè {0}). Quindi non è necessario ricordare quale oggetto va in quale posizione. La formattazione (cioè :n) non è cambiata. Per una funzionalità completa delle novità, puoi visitare questa pagina .


29

semplicemente semplice come questo:

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

maggiori informazioni sono qui


21

Se si desidera forzare un separatore "," indipendentemente dalla cultura (ad esempio in un messaggio di traccia o registro), il codice seguente funzionerà e avrà l'ulteriore vantaggio di dire al prossimo che si imbatte esattamente in ciò che si sta facendo.

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

imposta formattato su "19.400.320"


21

L'esempio seguente mostra diversi valori formattati usando stringhe di formato personalizzate che includono zero segnaposto.

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

O

29255.0.ToString("N1")

risultato "29.255,0"

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

O

29255.0.ToString("N2")

risultato "29.255,00"


bella risposta ma che dire di 29.255,00?
Roxy'Pro,

@ Roxy'Pro Cambia il locale / cultura?
Maarten Bodewes,

@MaartenBodewes Ho pensato che ci fosse una lettera corrispondente come "N1", "F1" o smth come quella =) Ma la cultura del
canto

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

3
Oppure Console.WriteLine ("{0: #, #}", num); se vuoi solo stamparlo. Ma string.Format (...) è più utile immagino.
Indy9000,

11

Più semplice, usando l'interpolazione di stringhe anziché String.Format

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

o usando yourVariable

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

9

Per esempio String.Format("{0:0,0}", 1); restituisce 01, per me non è valido

Questo funziona per me

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

uscita 19.950.000


8

Nota che il valore che stai formattando dovrebbe essere numerico. Non sembra che ci vorrà una rappresentazione in stringa di un numero e il formato è con virgole.



5

C # 7.1 (forse prima?) Lo rende facile e bello come dovrebbe essere, con interpolazione di stringhe:

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

3

È possibile utilizzare una funzione come questa per formattare i numeri e, facoltativamente, passare nelle posizioni decimali desiderate. Se non vengono specificate le posizioni decimali, verranno utilizzate due posizioni decimali.

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

Uso i decimali ma puoi cambiare il tipo in qualsiasi altro o usare un oggetto anonimo. È inoltre possibile aggiungere errori durante il controllo dei valori decimali negativi.


-2

Il metodo che ho usato per non preoccuparmi più delle culture e dei potenziali problemi di formattazione è che l'ho formattato come valuta e successivamente ho estratto il simbolo di valuta.

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

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

6
Questo codice non è indipendente dalla cultura: utilizzerà qualsiasi cultura predefinita impostata sulla macchina che esegue il codice. Ciò potrebbe creare un output indesiderato in cui quella cultura posiziona i propri simboli di valuta alla fine del numero anziché all'inizio (ad es. fr-FR) O utilizza più di un carattere per indicare la valuta (ad es. da-DK) O non separa migliaia utilizzando le virgole (ad es. La maggior parte dell'Europa continentale).
ribattuto il

-2

Di seguito è una buona soluzione in Java però!

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

o per un modo più robusto potresti voler ottenere le impostazioni locali di un determinato luogo, quindi utilizzare come di seguito:

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

USCITA Locale USA : 9.999.999,00 $

Uscita locale tedesca

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

USCITA: 9.999.999,00 €

Uscita locale indiana

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

USCITA: 9.999.999,00 Rs

Uscita locale estone

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

USCITA: 9999 999 €

Come puoi vedere in diversi output, non devi preoccuparti che il separatore sia una virgola o un punto o addirittura uno spazio , puoi ottenere il numero formattato secondo gli standard i18n


1
dove hai usato la variabile locale ??
Smith,

ben individuato correttamente, è da usare quando si ottiene l'istanza di valuta come: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); corretto il codice, grazie!
Anirudh,

3
Hai controllato i tag? La domanda riguarda C # non Java!
Salar,

-3

Se si desidera mostrarlo in DataGridview, è necessario modificarne il tipo, poiché l'impostazione predefinita è String e poiché lo si cambia in decimale, viene considerato come Numero con virgola mobile

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.