String format numerik khusus untuk selalu menampilkan tanda

188

Apakah ada cara saya dapat menentukan string format numerik standar atau kustom untuk selalu menampilkan tanda, baik itu + ve atau -ve (meskipun apa yang harus dilakukan untuk nol, saya tidak yakin!)

Craig Shearer
sumber

Jawaban:

297

Ya kamu bisa. Ada pemformatan bersyarat. Lihat pemformatan bersyarat di MSDN

misalnya:

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

Dimana setiap bagian yang dipisahkan oleh titik koma mewakili angka positif dan negatif

atau:

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

jika Anda tidak ingin nol memiliki tanda tambah.

gcores
sumber
1
Memperbaiki bug yang negatifnya tidak mendapat minus.
Roman Starkov
Terima kasih banyak! Saya telah mematahkan kepala saya selama satu jam untuk mencari tahu apa yang setara dengan '+' - bendera printf di C # dan Anda memberi saya jawaban.
rbaleksandar
4
dengan +#;-#, untuk nilai 0 saya mendapatkan hanya "+", tanpa sebenarnya 0. untuk saya, saya ingin 0 tampil sebagai "0", sehingga karya ini: +#;-#;+0.
orion elenzil
3
Terima kasih! Mencampur ini dengan ''akan melakukan hal-hal hebat! Lihat ini Changes.ToString("'('#' ▲)';'('#' ▼)';''"):! Ini menghemat banyak waktu dan ratusan ifpernyataan! :)
Shahab
1
@orionelenzil Saya punya masalah yang sama. Anda juga bisa melakukannya +0;-#daripada +#;-#;+0jawaban ini benar-benar menyesatkan bagi saya.
Kamil Szot
56

Hati-hati, saat menggunakan pemformatan bersyarat nilai negatif tidak secara otomatis mendapatkan tanda. Yang perlu Anda lakukan

string MyString = number.ToString("+#;-#;0");
Luk
sumber
Seperti yang ditunjukkan orang lain, +0;-#memberi Anda hasil yang sama dengan kode bersih.
Andrew
32

Anda juga dapat menggunakan format string dalam string.Format (); string format dipisahkan dari indeks dengan titik dua (':')

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

Untuk angka {+1, -1, 0} ini memberi:

1, Angkatan tanda +1, Tidak ada tanda untuk nol +1
-1, Angkatan tanda -1, Tidak ada tanda untuk nol -1
0, Angkatan tanda +0, Tidak ada tanda untuk nol 0

Anda juga dapat menggunakan string yang diinterpolasi alih-alih string.Formatmendapatkan hasil yang sama:

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";
Edward
sumber
Baris terakhir dari jawaban Anda harus mengatakan "Format default 0, tanda memaksa +, Tidak ada tanda untuk nol 0." karena itulah hasil sebenarnya dari +#;-#format untuk nilai 0
Kamil Szot
Terima kasih, Kamil - saya melewatkannya. Saya sekarang telah mengoreksi format tanda gaya: + #; - #; + 0 (bukan + #; - #)
Edward
1
Anda bisa mendapatkan perilaku tanda kekuatan dengan format sederhana: +0;-#. :)
Andrew
@ Andrew, Memang, tapi aku lebih suka +#;-#;+0lebih +#;-#karena hal ini membuatnya lebih jelas bahwa 0 akan diformat sebagai 0
Edward
10

Bertentangan dengan jawaban lain, tampaknya jika Anda ingin mendapatkan +1, -1, +0 (untuk argumen 1, -1, 0) Anda perlu menggunakan format:

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

atau

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

Jika Anda menggunakan hanya +#;-#itu akan menampilkan hanya +(tidak +0) untuk 0.

Specifier Kustom "#" (di https://msdn.microsoft.com/en-us/library/0c899ak8.aspx )

Perhatikan bahwa specifier ini tidak pernah menampilkan nol yang bukan digit signifikan, bahkan jika nol adalah satu-satunya digit dalam string. Ini akan menampilkan nol hanya jika itu adalah angka signifikan dalam jumlah yang sedang ditampilkan.

Juga harap diingat bahwa jika Anda membutuhkan ketelitian desimal, Anda perlu menentukannya seperti itu:

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

atau, jika Anda tidak ingin nol untuk selalu muncul, seperti itu:

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

Untuk ekspresi numerik dari jenis apa pun:

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

Gunakan tiga bagian untuk tiga kasus: positif, negatif, nol

Aspek lain dari contoh:

  • Nol tidak ditandatangani. Anda bisa menampilkannya sebagai apa saja, seperti "nol".

  • Nilai absolut kurang dari satu memiliki 0 di depan sebelum titik desimal. Sesuaikan dengan selera.

  • Jumlah digit adalah untuk nilai desimal absolut terbesar dan terkecil. Sesuaikan dengan selera.

  • Karakter titik desimal spesifik untuk budaya. Pengganti .NET.

  • Pemisah pengelompokan adalah opsional. Karakternya spesifik budaya. Pengganti .NET. (Posisi juga khusus untuk budaya tetapi hanya dikontrol oleh string format Anda.) Anda juga menggunakan karakter lain kecuali karakter khusus untuk Format (yang termasuk,. # 0).

Tom Blodget
sumber
0

Saya tidak dapat berkomentar, jadi saya Lakukan jawaban di sini (sistem reputasi gila ....)

Anda dapat menggunakan number.ToString ("+ 0; - #") dengan sangat baik untuk Menghasilkan UTC String TimeFormat

Di sini ditampilkan dalam kode PowerShell

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

@ Gcores terima kasih https://stackoverflow.com/users/40256/gcores

Peter Kriegel
sumber