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

Seibar
quelle

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
Seibar
quelle
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")
alchemistisch
quelle
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
p.campbell
quelle
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.

Prabir
quelle
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
CoderTao
quelle
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
Dennis
quelle
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.

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

von v.
quelle
29

so einfach ist das:

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

Weitere Infos finden Sie hier

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

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

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

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


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

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

Anirudh
quelle
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
Ali
quelle