Chuỗi định dạng số tùy chỉnh để luôn hiển thị dấu hiệu


188

Có cách nào để tôi có thể chỉ định một chuỗi định dạng số tiêu chuẩn hoặc tùy chỉnh để luôn xuất ra dấu hiệu, có thể là + ve hoặc -ve (mặc dù những gì nó nên làm cho số không, tôi không chắc chắn!)

Câu trả lời:


296

Vâng, bạn có thể. Có định dạng có điều kiện. Xem Định dạng có điều kiện trong MSDN

ví dụ:

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

Trong đó mỗi phần được phân tách bằng dấu chấm phẩy đại diện cho số dương và số âm

hoặc là:

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

nếu bạn không muốn số 0 có dấu cộng.


1
Đã sửa lỗi trong đó phủ định không được trừ.
Roman Starkov

Cảm ơn bạn rất nhiều! Tôi đã làm phiền mình trong một giờ để tìm ra cái gì tương đương với '+' - cờ của printf trong C # và bạn đã cho tôi câu trả lời.
rbaleksandar

4
với +#;-#, với giá trị 0 tôi chỉ nhận được "+", không có 0. thực tế đối với tôi, tôi muốn 0 xuất hiện dưới dạng "+0", vì vậy điều này hoạt động : +#;-#;+0.
orion elenzil

3
Cảm ơn! Trộn điều này với ''sẽ làm những điều tuyệt vời! Nhìn này : Changes.ToString("'('#' ▲)';'('#' ▼)';''")! Nó giúp tôi tiết kiệm rất nhiều thời gian và hàng trăm ifbáo cáo! :)
Shahab

1
@orionelenzil Mình cũng gặp vấn đề tương tự. Bạn cũng có thể làm +0;-#thay vì +#;-#;+0Câu trả lời này thực sự gây hiểu lầm cho tôi.
Kamil Szot

56

Coi chừng, khi sử dụng định dạng có điều kiện, giá trị âm sẽ không tự động nhận được dấu. Bạn cần phải làm

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

Như những người khác đã chỉ ra, +0;-#cung cấp cho bạn kết quả tương tự với mã sạch hơn.
Andrew

32

Bạn cũng có thể sử dụng các chuỗi định dạng trong chuỗi.Format (); chuỗi định dạng được phân tách khỏi chỉ mục bằng dấu hai chấm (':')

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

Đối với số {+1, -1, 0}, điều này mang lại:

1, Dấu hiệu lực lượng +1, Không có dấu hiệu nào cho +1 +1
, Dấu hiệu lực lượng -1, Không có dấu hiệu cho số 0 -1
, Dấu hiệu lực +0, Không có ký hiệu cho số 0

Bạn cũng có thể sử dụng một chuỗi nội suy thay vì string.Formatđể có được kết quả tương tự:

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

Dòng cuối cùng của câu trả lời của bạn sẽ ghi "Định dạng mặc định 0, Dấu hiệu lực +, Không có dấu cho số 0". bởi vì đó là kết quả thực tế của +#;-#định dạng cho giá trị 0
Kamil Szot

Cảm ơn bạn, Kamil - Tôi đã bỏ lỡ điều đó. Bây giờ tôi đã sửa định dạng dấu hiệu lực: + #; - #; + 0 (thay vì + #; - #)
Edward

1
Bạn có thể có được hành vi ký hiệu lực với định dạng đơn giản hơn : +0;-#. :)
Andrew

@Andrew, Thật vậy, nhưng tôi thích +#;-#;+0hơn +#;-#vì điều này làm rõ hơn rằng 0 sẽ được định dạng là +0
Edward

10

Trái với các câu trả lời khác, dường như nếu bạn muốn nhận +1, -1, +0 (đối với các đối số 1, -1, 0), bạn cần sử dụng định dạng:

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

hoặc là

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

Nếu bạn sử dụng chỉ +#;-#nó sẽ hiển thị +(không +0) cho 0.

Trình xác định tùy chỉnh "#" (tại https://msdn.microsoft.com/en-us/l Library / 0c899ak8.aspx )

Lưu ý rằng công cụ xác định này không bao giờ hiển thị số 0 không phải là chữ số có nghĩa, ngay cả khi số 0 là chữ số duy nhất trong chuỗi. Nó sẽ chỉ hiển thị số 0 nếu nó là một chữ số có nghĩa trong số đang được hiển thị.

Ngoài ra, hãy nhớ rằng nếu bạn cần bất kỳ độ chính xác thập phân nào, bạn cần chỉ định nó như thế:

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

hoặc, nếu bạn không phải lúc nào cũng xuất hiện, như thế:

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

1

Đối với một biểu thức số của bất kỳ loại nào:

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

Sử dụng ba phần cho ba trường hợp: tích cực, tiêu cực; không

Các khía cạnh khác của ví dụ:

  • Zero không được ký. Bạn có thể thấy nó hiển thị như mọi thứ, chẳng hạn như "không".

  • Các giá trị tuyệt đối nhỏ hơn một có 0 đứng trước dấu thập phân. Điều chỉnh theo khẩu vị.

  • Số chữ số dành cho các giá trị thập phân tuyệt đối lớn nhất và nhỏ nhất. Điều chỉnh theo khẩu vị.

  • Nhân vật điểm thập phân là đặc trưng văn hóa. Thay thế .NET.

  • Phân cách nhóm là tùy chọn. Các nhân vật là văn hóa cụ thể. Thay thế .NET. (Các vị trí cũng dành riêng cho văn hóa nhưng chỉ được điều khiển bởi chuỗi định dạng của bạn.) Bạn cũng sử dụng bất kỳ ký tự nào khác ngoại trừ các ký tự đặc biệt cho Định dạng (bao gồm ,. # 0).


0

Tôi không thể bình luận vì vậy tôi làm một câu trả lời ở đây (hệ thống danh tiếng hạt dẻ ....)

Bạn có thể sử dụng số.ToString ("+ 0; - #") rất tốt để Sản xuất Chuỗi thời gian UTC

Ở đây hiển thị trong mã PowerShell

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

Cảm ơn bạn @gcores https://stackoverflow.com/users/40256/gcores

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.