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