.NET String.Format () zum Hinzufügen von Kommas an Tausenderstellen für eine Zahl


852

Ich möchte ein Komma an der Tausenderstelle für eine Zahl einfügen.

String.Format()?

Antworten:


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);funktioniert auch ohne Dezimalstellen.
Greg Bray

9
Wie kann ich den "N" -Spezifizierer replizieren, jedoch mit so vielen Dezimalstellen, wie in der Zahl vorhanden sind?
Stephen Drew

56
@Justin: Laut msdn.microsoft.com/en-us/library/0c899ak8.aspx werden das ',' (und das '.') Durch die richtigen lokalisierten Zeichen ersetzt.
Roger Lipscombe

@ RogerLipscombe Ich hatte das nicht bemerkt
Justin

6
@VVVV - dann übergeben Sie wahrscheinlich eine Zeichenfolge anstelle einer Zahl . Wenn Sie eine Zeichenfolge haben, müssen Sie diese zuerst in float oder double konvertieren. Versuchen Siestring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

379

Ich fand das der einfachste Weg:

myInteger.ToString("N0")

1
Sie können es auch mit string.Format verwenden, wie in string.Format ("Hier ist eine Zahl mit Kommas und ohne Dezimalstellen, {0: N0}", 123456789 (;
Dan Morphis

16
sollte es nicht myInteger.ToString ("N0") sein ... string.tostring Ich glaube nicht, dass es funktionieren würde.
Taylor Brown

1
Ich weiß, es ist jetzt 5 Jahre her, aber danke! Es funktioniert für Zahlen> 4 Zeichen und <4 Zeichen.
AskYous

@AskYous - Nun, es funktioniert auch für 4 Zeichen. Könnte auch sagen, dass es für jede Länge funktioniert.
Broots Waymb

Dies funktioniert, aber es ändert sich in regionalen Einstellungen
Saulyasar

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

27
Diese Lösung ist aus Sicht der Internationalisierung nicht gut - andere Kulturen verwenden andere Zeichen ,als ein Tausendertrennzeichen, zum Beispiel ein Leerzeichen oder sogar ..
Justin

6
Funktioniert danke + 1. Haben erweitert, zeigt also bis zu 2 dp number.ToString ("#, ## 0. ##")
Crab Bucket

8
@MacSigler Es ist eigentlich nicht wahr, siehe Roger Lipscombes Kommentar zur obigen Antwort: String.Format wendet die Lokalisierung automatisch an.
Dan Bechard

10
@MacSigler Das ist die Sache, dieser Code druckt nicht immer ein Komma aus. Nur wenn die Kultur Kommas erwartet (z. B. en-US oder invariant). Wenn die Kultur ein anderes Trennzeichen erwartet (z. B. .), ersetzt .NET das Komma automatisch durch dieses Trennzeichen. Ich fordere Sie erneut auf, den von Roger geposteten Link zu lesen, wenn Sie immer noch nicht verstehen, warum dies so ist.
Dan Bechard

4
@MacSigler Justins Kommentar ist immer noch richtig, da er die Kultureinstellungen vom lokalen Computer erbt, wenn Sie die Kultur nicht explizit auf en-US zwingen. Nach meinem Verständnis würde das Kompilieren des obigen Codes und das anschließende Ausführen auf zwei Computern mit unterschiedlichen Kulturen (mit unterschiedlichen Zahlentrennzeichen) zu unterschiedlichen Ergebnissen führen. Wenn Sie möchten, dass immer ein Komma erzeugt wird, müssen Sie explizit eine Kultur festlegen, die das Komma verwendet (z. B. invariant).
Dan Bechard

98

Wenn Sie kulturspezifisch möchten, können Sie Folgendes ausprobieren:

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

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

Hinweis: Einige Kulturen ,bedeuten eher Dezimalzahl als .Vorsicht.


77

Standardformate mit ihren zugehörigen Ausgaben,

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

Beispielausgabe (en-us-Kultur):

(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
Diese Antwort enthielt viele nützliche Informationen. Wenn ich anhand eines Beispiels lerne, sehe ich jetzt, was 0 und 1 im Zeichenfolgenformat bedeuten.
user420667

41

Dies ist das beste Format. Funktioniert in all diesen Fällen:

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
Was ist, wenn ich Punkte als Tausendertrennzeichen und Komma als Dezimaltrennzeichen möchte?
FrenkyB

upvoted, weil es nicht 12.314,0 (wie das n1-Format), sondern 12.314
anzeigt

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

Dadurch erhalten Sie an den entsprechenden Stellen Kommas.


10
Die Methode ": n" ist besser, da sie das Gebietsschema des Benutzers berücksichtigen sollte.
Torlack

12
Dies ist wahr, aber es wird nicht garantiert, dass Sie bei Tausend Punkten Kommas erhalten, da dies das Gebietsschema des Benutzers berücksichtigt.
Stephen Wrighton

2
gleich wieder bei Ihnen: Das stimmt, aber es wird nicht garantiert, dass das Gebietsschema des Benutzers berücksichtigt wird, da Kommas als Tausendertrennzeichen verwendet werden. (In Portugal beispielsweise ist das Komma stattdessen das Dezimaltrennzeichen.)
ANeves

1
Wenn Sie Werte nach dem erzwingen möchten. Sie müssen das # durch eine 0 ersetzen. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : Null ersetzt die Null durch die entsprechende Ziffer, falls eine vorhanden ist. Andernfalls wird in der Ergebniszeichenfolge Null angezeigt, während das Symbol "#" durch die entsprechende Ziffer ersetzt wird, falls eine vorhanden ist. Andernfalls wird in der Ergebniszeichenfolge keine Ziffer angezeigt.
Clarice Bouwer

Diese Methode funktionierte für meine Anforderung einwandfrei. Die msdn-Seite über die Int32.ToString-Methode, bei der es sich hauptsächlich um die Verwendung von msdn.microsoft.com/en-us/library/8wch342y.aspx handelt, ist für diese spezielle Methode nicht sehr hilfreich Anwendung entweder
stackuser83

33

Die am häufigsten gewählte Antwort war großartig und seit etwa 7 Jahren hilfreich. Mit der Einführung von C # 6.0 und speziell der String-Interpolation gibt es eine übersichtlichere und, IMO sicherer, Möglichkeit, das zu tun, was gefragt wurde 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

Wo die Variable i anstelle des Platzhalters gesetzt wird (dh {0}). Sie müssen sich also nicht merken, welches Objekt zu welcher Position gehört. Die Formatierung (dh :n) hat sich nicht geändert. Auf dieser Seite finden Sie eine vollständige Beschreibung der neuen Funktionen .


29

so einfach ist das:

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

Weitere Infos finden Sie hier


21

Wenn Sie ein "," -Trennzeichen unabhängig von der Kultur erzwingen möchten (z. B. in einer Ablaufverfolgungs- oder Protokollnachricht), funktioniert der folgende Code und hat den zusätzlichen Vorteil, dass Sie dem nächsten Benutzer genau mitteilen, was Sie tun.

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

Sätze formatiert auf "19.400.320"


21

Im folgenden Beispiel werden mehrere Werte angezeigt, die mithilfe von benutzerdefinierten Formatzeichenfolgen formatiert werden, die keine Platzhalter enthalten.

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

Oder

29255.0.ToString("N1")

Ergebnis "29,255.0"

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

Oder

29255.0.ToString("N2")

Ergebnis "29.255,00"


nette Antwort, aber was ist mit 29.255,00?
Roxy'Pro

@ Roxy'Pro Gebietsschema / Kultur ändern?
Maarten Bodewes

@ MaartenBodewes Ich dachte, es gibt entsprechende Buchstaben wie "N1", "F1" oder so etwas =) Aber Chaning-Kultur würde definitiv funktionieren ..
Roxy'Pro

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

3
Oder Console.WriteLine ("{0: #, #}", num); wenn Sie es nur drucken möchten. Aber string.Format (...) ist wohl nützlicher.
Indy9000

11

Einfacher, mit String-Interpolation anstelle von String.Format

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

oder mit yourVariable

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

9

Zum Beispiel String.Format("{0:0,0}", 1);gibt 01 zurück, für mich ist es nicht gültig

Das funktioniert bei mir

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

Ausgabe 19.950.000


8

Beachten Sie, dass der Wert, den Sie formatieren, numerisch sein sollte. Es sieht nicht so aus, als würde eine Zeichenfolgendarstellung einer Zahl benötigt, und das Format ist mit Kommas.



5

C # 7.1 (vielleicht früher?) Macht dies mit String-Interpolation so einfach und gut aussehend, wie es sein sollte:

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

3

Mit einer solchen Funktion können Sie Zahlen formatieren und optional die gewünschten Dezimalstellen übergeben. Wenn keine Dezimalstellen angegeben werden, werden zwei Dezimalstellen verwendet.

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

Ich verwende Dezimalzahlen, aber Sie können den Typ in einen anderen ändern oder ein anonymes Objekt verwenden. Sie können auch eine Fehlerprüfung für negative Dezimalstellenwerte hinzufügen.


-2

Die Methode, mit der ich mich nicht mehr um Kulturen und mögliche Formatierungsprobleme gekümmert habe, besteht darin, dass ich sie als Währung formatiert und anschließend das Währungssymbol entfernt habe.

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

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

6
Dieser Code ist nicht kulturunabhängig. Er verwendet die Standardkultur, die auf dem Computer festgelegt ist, auf dem der Code ausgeführt wird. Dies kann zu unerwünschten Ausgaben führen, bei denen diese Kultur ihre Währungssymbole am Ende der Zahl und nicht am Anfang (z. B. fr-FR) platziert oder mehr als ein Zeichen zur Bezeichnung der Währung verwendet (z. B. da-DK) oder Tausende nicht durch Kommas trennt (z. B. die meisten) vom europäischen Festland).
raveturned

-2

Unten ist eine gute Lösung in Java!

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

oder für eine robustere Methode möchten Sie möglicherweise das Gebietsschema eines bestimmten Ortes abrufen und dann wie folgt verwenden:

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

US- Gebietsschema AUSGABE: 9.999.999,00 USD

Deutsche Gebietsschemaausgabe

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

AUSGABE: 9.999.999,00 €

Ausgabe des indischen Gebietsschemas

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

AUSGABE: Rs.9.999.999,00

Ausgabe des estnischen Gebietsschemas

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

AUSGABE: 9 999 999 €

Wie Sie in verschiedenen Ausgaben sehen können, müssen Sie sich keine Sorgen machen, dass das Trennzeichen ein Komma oder ein Punkt oder sogar ein Leerzeichen ist. Sie können die Zahl gemäß den i18n-Standards formatieren lassen


1
Wo hast du die Variable benutzt locale ?
Smith

gut richtig erkannt, ist es infact, um beim Abrufen der Währungsinstanz verwendet zu werden, wie: NumberFormat fmt = NumberFormat.getCurrencyInstance (Gebietsschema); Code korrigiert, danke!
Anirudh

3
Hast du die Tags überprüft? Die Frage ist über C # nicht Java!
Salar

-3

Wenn Sie es in DataGridview anzeigen möchten, sollten Sie seinen Typ ändern, da der Standardwert String ist und da Sie ihn in eine Dezimalzahl ändern, wird er als Zahl mit Gleitkomma betrachtet

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.