Bir sayı için binlerce yerde virgül eklemek için .NET String.Format ()


852

Bir sayı için binlerce yere virgül eklemek istiyorum.

String.Format()?

Yanıtlar:


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);ondalık basamak olmadan da çalışır.
Greg Bray

9
"N" belirtecini ancak sayıdaki ondalık basamakla nasıl çoğaltabilirim?
Stephen Drew

56
@ Justin: msdn.microsoft.com/en-us/library/0c899ak8.aspx ' e göre ', '(ve'. ') Doğru yerelleştirilmiş karakterlerle değiştirilir.
Roger Lipscombe

@RogerLipscombe Bunu fark etmemiştim
Justin

6
@VVVV - muhtemelen bir sayı yerine bir dizeden geçiyorsunuzdur . Bir dizeniz varsa, önce float veya double'a dönüştürmeniz gerekir. Deneyinstring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

379

Bunu en basit yol olarak buldum:

myInteger.ToString("N0")

1
Ayrıca String.format olduğu gibi String.format ile kullanabilirsiniz ( "İşte virgül ile bazı numarası ve ondalık yok, {0: N0} ise" 123456789 (;
Dan Morphis

16
myInteger.ToString ("N0") ... string.tostring olmamalı çalışacağını sanmıyorum.
Taylor Brown

1
Biliyorum 5 yıl oldu ama teşekkürler! > 4 karakter ve <4 karakter sayıları için çalışır.
AskYous

@AskYous - Peki, 4 karakter için de çalışıyor .. Her uzunlukta çalıştığını da söyleyebiliriz.
Broots Waymb

Bu çalışıyor, ancak bölgesel ayarlarda değişiyor
saulyasar

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

27
Bu çözüm uluslararasılaşma açısından iyi değildir - diğer kültürlerde ,binlerce ayırıcı, örneğin boşluk veya çift dışında karakterler kullanılır ..
Justin

6
+ 1 dp sayısını gösterir. ToString ("#, ## 0. ##")
Crab Bucket

8
@MacSigler Aslında doğru değil, Roger Lipscombe'un yukarıdaki cevaba yaptığı yorumu inceleyin: String.Format yerelleştirmeyi otomatik olarak uygulayacaktır.
Dan Bechard

10
O şey olsa var @MacSigler, bu kod değil , her zaman virgül yazdırmak. Sadece kültür, virgül bekleyen bir kültür olduğunda (ör. En-US veya değişmez). Kültür, başka bir ayırıcı (ör. .) Bekleyen bir kültür ise , .NET otomatik olarak virgül bu ayırıcı ile değiştirir. Yine, bunun nedenini hala anlamıyorsanız, Roger tarafından gönderilen bağlantıyı okumanızı tavsiye ediyorum.
Dan Bechard

4
@MacSigler Justin'in yorumu hala doğrudur, eğer kültürü açıkça ABD'ye zorlamazsanız, kültür ayarlarını yerel makineden devralır. Anladığım kadarıyla, yukarıdaki kodu derlemenin ardından farklı kültürlere sahip (farklı sayı ayırıcıları olan) iki makinede çalıştırmanın farklı sonuçlar üreteceğidir. Her zaman virgül üretmesini istiyorsanız, virgül kullanan bir kültürü (ör. Değişmez) açıkça ayarlamanız gerekir.
Dan Bechard

98

Kültüre özgü istiyorsanız bunu denemek isteyebilirsiniz:

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

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

Not: Bazı kültürler dikkatli olmak ,yerine ondalık anlamına gelir ..


77

Standart çıktılar, ilgili çıktılarıyla,

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

Örnek çıktı (en-us kültürü):

(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
Bu cevap birçok yararlı bilgi içeriyordu. Örnekle öğrenme şimdi dize biçiminde 0 ve 1'in ne anlama geldiğini görüyorum.
user420667

41

Bu en iyi biçimdir. Tüm bu durumlarda çalışır:

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
Ondalık ayırıcı olarak bin ayırıcı ve virgül olarak nokta istersem ne olur?
FrenkyB

12.314.0 (n1 biçimi gibi) göstermediği, ancak 12.314 :) görüntülediği için oylandı
NDUF

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

Bu size ilgili noktalarda virgül verecektir.


10
": N" yöntemi kullanıcının yerel ayarına saygı duyması gerektiğinden daha iyidir.
Torlack

12
Bu doğrudur, ancak bin noktada virgül vermeniz garanti edilmez, çünkü kullanıcının yerel ayarlarına saygı duyar.
Stephen Wrighton

2
tam size geri döndü: bu doğrudur, ancak kullanıcının yerel ayarlarına saygı gösterilmesi garanti edilmez, çünkü virgül binlerce ayırıcı olarak kullanır. (Örnek olarak, Portekiz'de virgül ondalık ayırıcıdır.)
46'da ANeves

1
Değerlerden sonra zorlamak istiyorsanız. # değerini 0 ile değiştirmeniz gerekir. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : Sıfır, varsa sıfırı karşılık gelen rakamla değiştirir; aksi takdirde, sonuç dizgisinde sıfır görüntülenirken "#" sembolü varsa, karşılık gelen basamakla değiştirilir; aksi takdirde, sonuç dizesinde hiçbir basamak görünmez.
Clarice Bouwer

Bu yöntem benim gereksinim için Tamam çalıştı, kullanılacak birincil bir yer olacağını Int32.ToString yöntemi hakkında msdn sayfası msdn.microsoft.com/en-us/library/8wch342y.aspx bu özel için çok yararlı değil uygulama ya da
stackuser83 25:14

33

En çok oy alan cevap harikaydı ve yaklaşık 7 yıldır yardımcı oldu. C # 6.0 ve özellikle String Interpolation'ın tanıtımı ile bir neater ve IMO daha güvenli, sorulan şeyi yapmanın bir yolu var 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

Değişkenin i yer tutucunun (yani {0}) yerine yerleştirilmesi. Böylece hangi nesnenin hangi konuma gittiğini hatırlamaya gerek yoktur. Biçimlendirme (ie :n) değişmedi. Yeniliklerin tam bir özelliği için bu sayfaya gidebilirsiniz .


29

sadece bu kadar basit:

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

daha fazla bilgi burada


21

Kültürden bağımsız olarak bir "," ayırıcısını zorlamak istiyorsanız (örneğin, bir izleme veya günlük iletisinde), aşağıdaki kod işe yarayacak ve tam olarak ne yaptığınızı tökezleyen bir sonraki adama söylemenin faydası olacaktır.

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

"19,400,320" olarak biçimlendirilmiş ayarlar


21

Aşağıdaki örnek, sıfır yer tutucu içeren özel biçim dizeleri kullanılarak biçimlendirilmiş birkaç değeri görüntüler.

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

Veya

29255.0.ToString("N1")

sonuç "29.255,0"

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

Veya

29255.0.ToString("N2")

sonuç "29.255,00"


güzel cevap ama ne olur 29.255,00?
Roxy'Pro

@ Roxy'Pro Bölge / kültür değiştirilsin mi?
Maarten Bodewes

@MaartenBodewes Ben "N1", "F1" veya böyle smth gibi karşılık gelen bir mektup olduğunu düşündüm =) Ama chaning kültür kesinlikle işe yarayacaktır ..
Roxy'Pro

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

3
Veya Console.WriteLine ("{0: #, #}", num); sadece yazdırmak istiyorsanız. Ama string.Format (...) sanırım daha kullanışlı.
Indy9000

11

String.Format yerine dize enterpolasyonu kullanmak daha basit

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

veya Değişken

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

9

Örneğin String.Format("{0:0,0}", 1);01 döndürür, benim için geçerli değil

Bu benim için çalışıyor

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

çıktı 19.950.000


8

Biçimlendirdiğiniz değerin sayısal olması gerektiğini unutmayın. Bir sayının dize ile temsilini alacak gibi görünmüyor ve biçim virgülle.



5

C # 7.1 (belki daha önce?) Bu, dize enterpolasyonu ile olması gerektiği kadar kolay ve güzel görünüyor:

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

3

Sayıları biçimlendirmek ve isteğe bağlı olarak istenen ondalık basamaklara geçmek için böyle bir işlevi kullanabilirsiniz. Ondalık basamaklar belirtilmezse, iki ondalık basamak kullanılır.

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

Ondalık kullanıyorum, ancak türü başka birine değiştirebilir veya anonim bir nesne kullanabilirsiniz. Negatif ondalık basamak değerleri için hata denetimi de ekleyebilirsiniz.


-2

Kültürler ve potansiyel biçimlendirme sorunları hakkında artık endişelenmemem için kullanılan yöntem, onu para birimi olarak biçimlendirmem ve daha sonra para birimi sembolünü çıkarmamdı.

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

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

6
Bu kod kültürden bağımsız değildir - kodu çalıştıran makinede ayarlanan varsayılan kültürü kullanır. Bu, kültürün para birimi sembollerini başlangıçtan ziyade sayının sonuna yerleştirdiği (örn. fr-FR) Veya para birimini belirtmek için birden fazla karakter kullandığı (örneğin da-DK) veya binleri virgülle ayırmadığı (ör. anakara Avrupa).
Haziran'da

-2

Aşağıda Java'da iyi bir çözüm var!

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

veya daha sağlam bir şekilde belirli bir yerin yerel ayarını almak isteyebilirsiniz, ardından aşağıdaki gibi kullanın:

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

ABD Yerel Çıktısı: 9,999,999,00 dolar

Alman Yerel Ayarları

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

ÇIKTI: 9.999.999,00 €

Hint yerel ayarı

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

ÇIKTI: 9.999.999,00 TL

Estonya Yerel Ayarları

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

ÇIKTI: 9999999 €

Farklı çıktılarda görebileceğiniz gibi, ayırıcının virgül veya nokta veya hatta boşluk olması konusunda endişelenmenize gerek yoktur , i18n standartlarına göre biçimlendirilmiş sayıyı alabilirsiniz


1
Değişkeni nerede kullandınız locale ??
Smith

doğru bir şekilde tespit edildiğinde, para birimi örneği alınırken kullanılacak olan: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); kod düzeltildi, teşekkürler!
Anirudh

3
Etiketleri kontrol ettin mi? Soru Java ile değil C # ile ilgili!
Salar

-3

DataGridview içinde göstermek istiyorsanız, varsayılan olarak String olduğu ve ondalık olarak değiştirdiğiniz için kayan noktalı Sayı olarak kabul ettiği için türünü değiştirmeniz gerekir.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.