.NET String.Format () เพื่อเพิ่มเครื่องหมายจุลภาคเป็นหลักพันสำหรับตัวเลข


852

ฉันต้องการเพิ่มเครื่องหมายจุลภาคในหลักพันสำหรับตัวเลข

String.Format()?

คำตอบ:


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);ใช้ได้กับไม่มีทศนิยม
Greg Bray

9
ฉันจะทำซ้ำตัวระบุ "N" แต่มีทศนิยมเป็นจำนวนมากเท่าที่มีอยู่ในตัวเลขได้อย่างไร
สตีเฟ่น Drew

56
@Justin: ตามmsdn.microsoft.com/en-us/library/0c899ak8.aspx ระบบจะแทนที่ ',' (และ '.') ด้วยอักขระที่ถูกแปลเป็นภาษาท้องถิ่นที่ถูกต้อง
Roger Lipscombe

@RogerLipscombe ฉันไม่ได้ตระหนักถึงสิ่งนั้น
Justin

6
@VVVV - แล้วคุณอาจจะผ่านในสตริงแทนจำนวน หากคุณมีสตริงคุณต้องแปลงให้ลอยหรือดับเบิล ลองstring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

379

ฉันพบสิ่งนี้เป็นวิธีที่ง่ายที่สุด:

myInteger.ToString("N0")

1
นอกจากนี้คุณยังสามารถใช้กับสตริงจัดรูปแบบในรูปแบบสตริง ("นี่คือตัวเลขบางส่วนที่มีเครื่องหมายจุลภาคและไม่มีทศนิยม {0: N0}", 123456789 (;
Dan Morphis

16
ไม่ควรเป็น myInteger.ToString ("N0") ... string.tostring ฉันไม่คิดว่าจะทำงานได้
Taylor Brown

1
ฉันรู้ว่า 5 ปีแล้ว แต่ขอบคุณ! มันใช้งานได้กับตัวเลข> 4 ตัวอักษรและ <4 ตัวอักษร
AskYous

@AskYous - ก็ใช้งานได้สำหรับ 4 ตัวอักษร .. อาจจะบอกว่ามันใช้ได้กับทุกความยาว
Broots Waymb

สิ่งนี้ใช้งานได้ แต่กำลังเปลี่ยนการตั้งค่าภูมิภาค
saulyasar

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

27
วิธีการแก้ปัญหานี้ไม่ดีจากจุดที่เป็นสากลของมุมมอง - วัฒนธรรมอื่น ๆ ที่ใช้ตัวละครอื่น ๆ กว่าเป็นตัวคั่นพันตัวอย่างเช่นพื้นที่หรือแม้กระทั่ง, .
Justin

6
ใช้งานได้ดีขอบคุณ + 1 ขยายเวลามากถึง 2 dp number.ToString ("#, ## 0. ##")
Crab Bucket

8
@MacSigler จริง ๆ แล้วมันไม่จริงเห็นความเห็นของ Roger Lipscombe ในคำตอบข้างต้น: String.Format จะใช้การแปลโดยอัตโนมัติ
Dan Bechard

10
@MacSigler นั่นเป็นสิ่งที่แม้ว่ารหัสนี้ไม่ได้ เสมอพิมพ์เครื่องหมายจุลภาค เมื่อวัฒนธรรมเป็นสิ่งที่คาดหวังว่าจะใช้เครื่องหมายจุลภาค (เช่น en-US หรือค่าคงที่) หากวัฒนธรรมเป็นสิ่งที่คาดว่าจะมีตัวคั่นอื่น (เช่น.). NET จะแทนที่เครื่องหมายจุลภาคด้วยตัวคั่นนั้นโดยอัตโนมัติ อีกครั้งฉันขอให้คุณอ่านลิงค์โพสต์โดย Roger ถ้าคุณยังไม่เข้าใจว่าทำไมถึงเป็นเช่นนั้น
Dan Bechard

4
@MacSigler ความคิดเห็นของ Justin ยังคงถูกต้องหากคุณไม่ได้บังคับให้วัฒนธรรมเข้ามาในสหรัฐอเมริกาอย่างชัดเจนมันจะรับมรดกการตั้งค่าวัฒนธรรมจากเครื่องท้องถิ่น ความเข้าใจของฉันคือการรวบรวมโค้ดด้านบนจากนั้นเรียกใช้บนเครื่องสองเครื่องที่มีวัฒนธรรมที่แตกต่างกัน (ที่มีตัวคั่นตัวเลขแตกต่างกัน) จะให้ผลลัพธ์ที่แตกต่างกัน หากคุณต้องการให้สร้างเครื่องหมายจุลภาคเสมอคุณต้องกำหนดวัฒนธรรมที่ใช้เครื่องหมายจุลภาค (เช่นค่าคงที่) อย่างชัดเจน
Dan Bechard

98

หากคุณต้องการวัฒนธรรมที่เฉพาะเจาะจงคุณอาจต้องการลองนี้:

(19950000.0).ToString("N",new CultureInfo("en-US")) = 19,950,000.00

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

หมายเหตุ: บางวัฒนธรรมใช้,เพื่อหมายถึงทศนิยมแทนที่จะ.ระวังให้ดี


77

รูปแบบมาตรฐานพร้อมเอาต์พุตที่เกี่ยวข้อง

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

ตัวอย่างเอาต์พุต (วัฒนธรรม 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
คำตอบนี้เต็มไปด้วยข้อมูลที่เป็นประโยชน์มากมาย เรียนรู้จากตัวอย่างตอนนี้ฉันเห็นความหมายของ 0 และ 1 ในรูปแบบสตริง
user420667

41

นี่คือรูปแบบที่ดีที่สุด ทำงานได้ในทุกกรณี:

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
ถ้าฉันต้องการให้จุดเป็นตัวคั่นหลักพันและเครื่องหมายจุลภาคเป็นตัวคั่นทศนิยม
FrenkyB

upvoted เพราะมันไม่ได้แสดง 12,314.0 (เช่นรูปแบบ n1) แต่ 12,314 :)
NDUF

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

ที่จะให้คุณจุลภาคที่จุดที่เกี่ยวข้อง


10
วิธีการ ": n" ดีกว่าเนื่องจากควรเคารพสถานที่ของผู้ใช้
Torlack

12
สิ่งนี้เป็นจริง แต่ไม่รับประกันว่าจะให้เครื่องหมายจุลภาคกับคุณที่จุดพันเนื่องจากเป็นไปตามที่ตั้งของผู้ใช้
Stephen Wrighton

2
กลับมาที่คุณ: นั่นเป็นเรื่องจริง แต่ไม่รับประกันว่าจะเคารพสถานที่ของผู้ใช้เพราะใช้เครื่องหมายจุลภาคเป็นตัวคั่นหลักพัน (เป็นตัวอย่างในโปรตุเกสเครื่องหมายจุลภาคแทนตัวคั่นทศนิยม)
ANeves

1
หากคุณต้องการบังคับใช้ค่าหลังจาก คุณต้องแทนที่ # ด้วย 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : Zero จะแทนที่ศูนย์ด้วยตัวเลขที่สอดคล้องกันหากมีอยู่; มิฉะนั้นศูนย์จะปรากฏในสตริงผลลัพธ์ในขณะที่สัญลักษณ์ "#" จะถูกแทนที่ด้วยตัวเลขที่สอดคล้องกันหากมีหนึ่ง; ไม่เช่นนั้นจะไม่มีตัวเลขปรากฏในสตริงผลลัพธ์
Clarice Bouwer

วิธีนี้ใช้ได้ผลกับความต้องการของฉันหน้า msdn เกี่ยวกับวิธีการ Int32.ToString ที่จะเป็นที่หลักที่จะใช้msdn.microsoft.com/en-us/library/8wch342y.aspxไม่เป็นประโยชน์สำหรับคนนี้มากนัก แอปพลิเคชันอย่างใดอย่างหนึ่ง
stackuser83

33

คำตอบที่ได้รับการโหวตมากที่สุดนั้นยอดเยี่ยมและมีประโยชน์มาประมาณ 7 ปี ด้วยการแนะนำ C # 6.0 และการแก้ไขสตริงโดยเฉพาะมีผู้เข้าชมมากกว่าและปลอดภัยกว่า IMO วิธีทำสิ่งที่ถูกถาม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

ตำแหน่งที่ตัวแปรi ถูกแทนที่ด้วยตัวยึดตำแหน่ง (เช่น{0}) ดังนั้นไม่จำเป็นต้องจำสิ่งที่วัตถุไปยังตำแหน่งใด การจัดรูปแบบ (เช่น:n) ไม่เปลี่ยนแปลง สำหรับคุณสมบัติที่สมบูรณ์ของสิ่งใหม่คุณสามารถไปที่หน้านี้



21

หากคุณต้องการบังคับตัวคั่น "," โดยไม่คำนึงถึงวัฒนธรรม (เช่นในการติดตามหรือข้อความบันทึก) รหัสต่อไปนี้จะทำงานและมีประโยชน์เพิ่มเติมในการบอกคนต่อไปที่สะดุดในสิ่งที่คุณกำลังทำ

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

กำหนดรูปแบบเป็น "19,400,320"


21

ตัวอย่างต่อไปนี้แสดงค่าหลายค่าที่จัดรูปแบบโดยใช้สตริงรูปแบบกำหนดเองที่มีตัวยึดพื้นที่เป็นศูนย์

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

หรือ

29255.0.ToString("N1")

ผลลัพธ์ "29,255.0"

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

หรือ

29255.0.ToString("N2")

ผลลัพธ์ "29,255.00"


คำตอบที่ดี แต่ประมาณ 29.255,00
Roxy'Pro

@ Roxy'Pro เปลี่ยนสถานที่ / วัฒนธรรม?
Maarten Bodewes

@MaartenBodewes ฉันคิดว่ามีตัวอักษรที่เกี่ยวข้องเช่น "N1", "F1" หรือ smth อย่างนั้น =) แต่วัฒนธรรม
chaning

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

3
หรือ Console.WriteLine ("{0: #, #}", NUM); ถ้าคุณต้องการพิมพ์ แต่ string.Format (... ) มีประโยชน์มากกว่าฉันเดา
Indy9000

11

ง่ายกว่าโดยใช้การแก้ไขสตริงแทน String.Format

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

หรือใช้ yourVariable

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

9

ตัวอย่างเช่นString.Format("{0:0,0}", 1);คืน 01 สำหรับฉันไม่ถูกต้อง

มันใช้งานได้สำหรับฉัน

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

ผลผลิต 19,950,000


8

โปรดทราบว่าค่าที่คุณกำลังจัดรูปแบบควรเป็นตัวเลข มันดูไม่เหมือนว่ามันจะใช้การแทนค่าสตริงของตัวเลขและรูปแบบคือเครื่องหมายจุลภาค



5

C # 7.1 (อาจจะเร็วกว่านี้หรือไม่) ทำให้สิ่งนี้เป็นเรื่องง่ายและดูดีอย่างที่ควรจะเป็นด้วยการแก้ไขสตริง:

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

3

คุณสามารถใช้ฟังก์ชั่นเช่นนี้เพื่อจัดรูปแบบตัวเลขและเลือกที่จะผ่านในตำแหน่งทศนิยมที่ต้องการ หากไม่ได้ระบุตำแหน่งทศนิยมจะใช้ทศนิยมสองตำแหน่ง

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

ฉันใช้ทศนิยม แต่คุณสามารถเปลี่ยนประเภทเป็นอื่น ๆ หรือใช้วัตถุที่ไม่ระบุชื่อ คุณสามารถเพิ่มการตรวจสอบข้อผิดพลาดสำหรับค่าทศนิยมที่เป็นลบ


-2

วิธีที่ฉันไม่ต้องกังวลอีกต่อไปเกี่ยวกับวัฒนธรรมและปัญหาการจัดรูปแบบที่เป็นไปได้คือฉันจัดรูปแบบเป็นสกุลเงินและนำสัญลักษณ์สกุลเงินออกมาหลังจากนั้น

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

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

6
รหัสนี้ไม่ได้ขึ้นอยู่กับวัฒนธรรม - มันจะใช้สิ่งที่วัฒนธรรมเริ่มต้นตั้งอยู่บนเครื่องใช้รหัส สิ่งนี้สามารถสร้างผลลัพธ์ที่ไม่พึงประสงค์เมื่อวัฒนธรรมนั้นวางสัญลักษณ์สกุลเงินไว้ที่ท้ายตัวเลขแทนที่จะเริ่ม (เช่นfr-FR) หรือใช้อักขระมากกว่าหนึ่งตัวเพื่อแสดงถึงสกุลเงิน (เช่นda-DK) หรือไม่แยกพันโดยใช้เครื่องหมายจุลภาค (เช่นส่วนใหญ่ ของแผ่นดินใหญ่ยุโรป)
raveturned

-2

ด้านล่างเป็นทางออกที่ดีใน Java แม้ว่า!

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

หรือสำหรับวิธีที่มีประสิทธิภาพยิ่งขึ้นคุณอาจต้องการรับสถานที่ของสถานที่เฉพาะจากนั้นใช้ดังต่อไปนี้:

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

สถานที่ส่งออกของสหรัฐอเมริกา : $ 9,999,999.00

สถานที่เกิดเหตุเยอรมัน

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

ผลลัพธ์: 9.999.999,00 €

สถานที่เกิดเหตุของอินเดีย

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

ผลลัพธ์: Rs.9,999,999.00

เอสโตเนียสถานที่เอาท์พุท

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

ผลลัพธ์: 9 999 999 €

อย่างที่คุณเห็นในเอาต์พุตต่าง ๆ คุณไม่ต้องกังวลว่าตัวคั่นจะเป็นเครื่องหมายจุลภาคหรือจุดหรือเว้นวรรคคุณสามารถจัดรูปแบบตัวเลขตามมาตรฐาน i18n


1
คุณไม่ใช้ตัวแปรที่locale ??
สมิ ธ

ดีด่างอย่างถูกต้องมันเป็น infact ที่จะใช้ในขณะที่รับอินสแตนซ์ของสกุลเงินเช่น: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); แก้ไขรหัสแล้วขอบคุณ!
Anirudh

3
คุณตรวจสอบแท็กแล้วหรือยัง คำถามเกี่ยวกับ C # ไม่ใช่ Java!
ซาลาร์

-3

ถ้าคุณต้องการที่จะแสดงมันใน DataGridview คุณควรเปลี่ยนประเภทเพราะเริ่มต้นเป็นสตริงและเนื่องจากคุณเปลี่ยนเป็นทศนิยมมันจะถือว่าเป็นจำนวนที่มีจุดลอยตัว

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.