สตริงรูปแบบตัวเลขที่กำหนดเองเพื่อแสดงสัญญาณเสมอ


188

มีวิธีใดบ้างที่ฉันสามารถระบุสตริงรูปแบบตัวเลขมาตรฐานหรือแบบกำหนดเองเพื่อส่งสัญญาณได้เสมอไม่ว่าจะเป็น + ve หรือ -ve (แม้ว่าสิ่งที่ควรทำสำหรับศูนย์ฉันไม่แน่ใจ!)

คำตอบ:


297

ใช่คุณสามารถ. มีการจัดรูปแบบตามเงื่อนไข ดูการจัดรูปแบบตามเงื่อนไขใน MSDN

เช่น:

string MyString = number.ToString("+0;-#");

โดยที่แต่ละส่วนคั่นด้วยเครื่องหมายอัฒภาคแสดงถึงจำนวนบวกและลบ

หรือ:

string MyString = number.ToString("+#;-#;0");

หากคุณไม่ต้องการให้ศูนย์มีเครื่องหมายบวก


1
แก้ไขข้อผิดพลาดที่เชิงลบไม่ได้ลบ
Roman Starkov

ขอบคุณมาก! ฉันจับหัวของฉันเป็นเวลาหนึ่งชั่วโมงเพื่อหาสิ่งที่เทียบเท่ากับ '+' - ธงของ printf ใน C # และคุณให้คำตอบฉัน
rbaleksandar

4
ด้วย+#;-#สำหรับค่า 0 ฉันได้รับเพียงแค่ "+" ไม่มีจริง 0. สำหรับฉันฉันต้องการ 0 ถึงปรากฏเป็น "0" +#;-#;+0เพื่อให้งานนี้:
orion elenzil

3
ขอบคุณ! การผสมกับสิ่งนี้''จะทำสิ่งที่ยอดเยี่ยม! ดูที่นี่: Changes.ToString("'('#' ▲)';'('#' ▼)';''")! มันช่วยฉันประหยัดเวลาได้มากและมีข้อความหลายร้อยifข้อความ! :)
Shahab

1
@orionelenzil ฉันมีปัญหาเดียวกัน คุณสามารถทำได้+0;-#แทน+#;-#;+0คำตอบนี้ทำให้ฉันเข้าใจผิดจริงๆ
Kamil Szot

56

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

string MyString = number.ToString("+#;-#;0");

ดังที่คนอื่น ๆ ชี้+0;-#ให้คุณเห็นผลลัพธ์เดียวกันกับโค้ดที่สะอาดกว่า
Andrew

32

คุณยังสามารถใช้สตริงรูปแบบใน string.Format (); สตริงรูปแบบถูกแยกออกจากดัชนีด้วยเครื่องหมายโคลอน (':')

var f = string.Format("{0}, Force sign {0:+#;-#;+0}, No sign for zero {0:+#;-#;0}", number);

สำหรับหมายเลข {+1, -1, 0} สิ่งนี้จะให้:

1, เครื่องหมายบังคับ +1, ไม่มีเครื่องหมายสำหรับศูนย์ +1
-1, เครื่องหมายบังคับ -1, ไม่มีสัญลักษณ์สำหรับศูนย์ -1
0, เครื่องหมายบังคับ +0, ไม่มีเครื่องหมายสำหรับศูนย์ 0

คุณยังสามารถใช้สตริงที่สอดแทรกแทนที่จะstring.Formatรับผลลัพธ์เดียวกัน:

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";

บรรทัดสุดท้ายของคำตอบของคุณควรพูดว่า "รูปแบบเริ่มต้น 0, เครื่องหมายบังคับ +, ไม่มีเครื่องหมายศูนย์ 0" เพราะนั่นคือผลลัพธ์ที่แท้จริงของการจัด+#;-#รูปแบบสำหรับค่า 0
Kamil Szot

ขอบคุณ Kamil - ฉันพลาดไป ตอนนี้ฉันได้แก้ไขรูปแบบเครื่องหมายบังคับ: + #; - #; + 0 (แทนที่จะเป็น + #; - #)
Edward

1
+0;-#คุณจะได้รับพฤติกรรมสัญญาณแรงด้วยรูปแบบที่เรียบง่าย: :)
Andrew

@Andrew แน่นอน แต่ฉันชอบ+#;-#;+0มากกว่า+#;-#นี้ทำให้ชัดเจนว่า 0 จะจัดรูปแบบเป็น +0
Edward

10

ตรงกันข้ามกับคำตอบอื่น ๆ ดูเหมือนว่าหากคุณต้องการรับ +1, -1, +0 (สำหรับอาร์กิวเมนต์ 1, -1, 0) คุณต้องใช้รูปแบบ:

String.Format("{0:+#;-#;+0}", 0));  // output: +0

หรือ

String.Format("{0:+0;-#}", 0));  // output: +0

หากคุณใช้เพียงแค่+#;-#มันจะแสดงเพียง+(ไม่+0) สำหรับ 0

ตัวระบุแบบกำหนดเอง "#" (ที่https://msdn.microsoft.com/en-us/library/0c899ak8.aspx )

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

นอกจากนี้โปรดทราบว่าหากคุณต้องการความแม่นยำทศนิยมใด ๆ คุณต้องระบุเช่น:

String.Format("{0:+0.##;-#.##}", 0));  // output: +0

หรือถ้าคุณไม่ต้องการแสดงค่าศูนย์เช่นนั้น:

String.Format("{0:+0.00;-#.00}", 0));  // output: +0.00

1

สำหรับนิพจน์ตัวเลขทุกประเภท:

+###,###,###,###,###,###,###,###,###,##0.###,###,###,###,###,###,###,###,###,###;-###,###,###,###,###,###,###,###,###,##0.###,###,###,###,###,###,###,###,###,###;0

ใช้สามส่วนสำหรับสามกรณี: บวก; ลบ; ศูนย์

ด้านอื่น ๆ ของตัวอย่าง:

  • ศูนย์ไม่ได้ลงชื่อ คุณสามารถให้มันแสดงเป็นอะไรก็ได้เช่น "ศูนย์"

  • ค่าสัมบูรณ์น้อยกว่าหนึ่งมี 0 นำหน้าก่อนจุดทศนิยม ปรับเพื่อลิ้มรส

  • จำนวนหลักสำหรับค่าทศนิยมที่ใหญ่ที่สุดและเล็กที่สุด ปรับเพื่อลิ้มรส

  • อักขระตำแหน่งทศนิยมเป็นแบบเจาะจงวัฒนธรรม .NET ทดแทน

  • ตัวแยกการจัดกลุ่มเป็นทางเลือก ตัวละครเป็นวัฒนธรรมเฉพาะ .NET ทดแทน (ตำแหน่งนั้นเป็นแบบเฉพาะวัฒนธรรม แต่ถูกควบคุมโดยสตริงรูปแบบของคุณเท่านั้น) นอกจากนี้คุณยังใช้อักขระอื่นยกเว้นอักขระพิเศษสำหรับรูปแบบ (ซึ่งรวมถึง. # 0)


0

ฉันไม่สามารถแสดงความคิดเห็นดังนั้นฉันจะตอบที่นี่ (ระบบชื่อเสียงถั่ว .... )

คุณสามารถใช้ number.ToString ("+ 0; - #") ได้เป็นอย่างดีในการผลิต UTC TimeFormat

นี่แสดงให้เห็นในรหัส PowerShell

"$([System.DateTime]::Now.ToString('HH:mm:ss.fff'))$($([System.TimeZoneInfo]::Local.GetUtcOffset([System.DateTime]::Now).TotalMinutes.ToString('+0;-#')))"

ขอบคุณ @gcores https://stackoverflow.com/users/40256/gcores

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