.NET String.Format () untuk menambahkan koma di ribuan tempat untuk suatu nomor

852

Saya ingin menambahkan koma di ribuan tempat untuk nomor.

String.Format()?

Seibar
sumber

Jawaban:

1216
String.Format("{0:n}", 1234);  // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876
Seibar
sumber
39
String.Format("{0:#,##0}", 1234);juga berfungsi tanpa tempat desimal.
Greg Bray
9
Bagaimana saya bisa mereplikasi specifier "N" tetapi dengan angka desimal sebanyak yang ada dalam nomor?
Stephen Drew
56
@Justin: Menurut msdn.microsoft.com/en-us/library/0c899ak8.aspx , ',' (dan '.') Diganti dengan karakter lokal yang benar.
Roger Lipscombe
@ RogerLipscombe saya tidak menyadari bahwa
Justin
6
@VVVV - maka Anda mungkin melewati string bukan angka . Jika Anda memiliki string, Anda harus terlebih dahulu mengonversi menjadi float atau double. Cobastring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve
379

Saya menemukan ini sebagai cara paling sederhana:

myInteger.ToString("N0")
alkimia
sumber
1
Anda juga dapat menggunakannya dengan string.Format, seperti dalam string.Format ("Berikut adalah beberapa angka dengan koma, dan tanpa desimal, {0: N0}", 123456789 (;
Dan Morphis
16
seharusnya tidak menjadi myInteger.ToString ("N0") ... string.tostring saya tidak berpikir akan berhasil.
Taylor Brown
1
Saya tahu ini sudah 5 tahun sekarang, tapi terima kasih! Ini berfungsi untuk angka> 4 karakter, dan <4 karakter.
AskYous
@AskYous - Yah, itu juga berfungsi untuk 4 karakter .. Bisa juga mengatakan itu bekerja untuk waktu yang lama.
Broots Waymb
Ini berfungsi tetapi itu berubah pada pengaturan regional
saulyasar
149
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000
p.campbell
sumber
27
Solusi ini tidak baik dari sudut pandang internasionalisasi - budaya lain menggunakan karakter selain ,sebagai pemisah ribuan, misalnya spasi atau genap ..
Justin
6
Berfungsi + 1. Telah diperluas sehingga menampilkan hingga 2 nomor dp. Melakukan Strtring ("#, ## 0. ##")
Crab Bucket
8
@ MacSigler Ini sebenarnya tidak benar, lihat komentar Roger Lipscombe pada jawaban di atas: String.Format akan menerapkan pelokalan secara otomatis.
Dan Bechard
10
@ MacSigler Itulah masalahnya, kode ini tidak selalu mencetak koma. Hanya ketika budaya adalah budaya yang mengharapkan koma (mis. En-AS atau invarian). Jika budaya adalah salah satu yang mengharapkan pemisah lain (misalnya .), .NET akan secara otomatis mengganti koma dengan pemisah itu. Sekali lagi, saya mendorong Anda untuk membaca tautan yang diposting oleh Roger jika Anda masih tidak mengerti mengapa ini terjadi.
Dan Bechard
4
@MacSigler Komentar Justin masih benar karena jika Anda tidak secara eksplisit memaksa budaya ke en-AS, itu akan mewarisi pengaturan budaya dari mesin lokal. Pemahaman saya adalah bahwa mengkompilasi kode di atas, kemudian menjalankannya pada dua mesin dengan budaya yang berbeda (dengan pemisah jumlah yang berbeda) akan menghasilkan hasil yang berbeda. Jika Anda ingin selalu menghasilkan koma, Anda perlu menetapkan budaya yang menggunakan koma secara eksplisit (mis. Invarian).
Dan Bechard
98

Jika Anda ingin spesifik budaya, Anda mungkin ingin mencoba ini:

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

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

Catatan: Beberapa budaya menggunakan ,desimal daripada .berhati-hati.

prabir
sumber
77

Format standar, dengan output terkait,

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

Contoh output (en-us culture):

(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
CoderTao
sumber
2
Jawaban ini mengemas banyak informasi berguna. Belajar dengan contoh sekarang saya mengerti apa arti 0 dan 1 dalam format string.
user420667
41

Ini format terbaik. Bekerja dalam semua kasus tersebut:

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
Dennis
sumber
1
Bagaimana jika saya ingin titik sebagai pemisah ribuan dan koma sebagai pembatas desimal?
FrenkyB
dibatalkan karena tidak menampilkan 12.314.0 (seperti format n1) tetapi 12.314 :)
NDUF
34
String.Format("{0:#,###,###.##}", MyNumber)

Itu akan memberi Anda koma pada titik yang relevan.

Stephen Wrighton
sumber
10
Metode ": n" lebih baik karena harus menghormati lokal pengguna.
Torlack
12
Ini benar, tetapi tidak dijamin memberi Anda koma pada titik ribuan karena itu menghormati lokal pengguna.
Stephen Wrighton
2
langsung kembali kepada Anda: itu benar, tetapi tidak dijamin untuk menghormati lokal pengguna karena menggunakan koma sebagai pemisah ribuan. (Sebagai contoh, di Portugal koma bukan pemisah desimal.)
ANeves
1
Jika Anda ingin menerapkan nilai setelah. Anda perlu mengganti # dengan 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : Nol menggantikan nol dengan angka yang sesuai jika ada; jika tidak, nol muncul di string hasil sedangkan simbol "#" diganti dengan digit yang sesuai jika ada; jika tidak, tidak ada digit yang muncul di string hasil.
Clarice Bouwer
metode ini berfungsi baik untuk kebutuhan saya, halaman msdn tentang metode Int32.ToString yang akan menjadi tempat utama itu akan digunakan msdn.microsoft.com/en-us/library/8wch342y.aspx tidak terlalu membantu untuk hal ini aplikasi baik
stackuser83
33

Jawaban yang paling banyak dipilih sangat bagus dan telah membantu selama sekitar 7 tahun. Dengan diperkenalkannya C # 6.0 dan khususnya Interpolasi String ada cara yang lebih rapi dan, lebih aman, untuk melakukan apa yang diminta 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

Di mana variabel i ditempatkan menggantikan placeholder (yaitu {0}). Jadi tidak perlu mengingat objek mana yang menuju ke posisi mana. Format (yaitu :n) tidak berubah. Untuk fitur lengkap tentang apa yang baru, Anda dapat pergi ke halaman ini .

von v.
sumber
29

sesederhana ini:

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

info lebih lanjut ada di Sini

a_m_dev
sumber
21

Jika Anda ingin memaksakan pemisah "," terlepas dari budaya (misalnya dalam jejak atau pesan log), kode berikut ini akan berfungsi dan memiliki manfaat tambahan untuk memberi tahu orang berikutnya yang menemukan apa yang sedang Anda lakukan.

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

set diformat ke "19.400.320"

Ravi Desai
sumber
21

Contoh berikut menampilkan beberapa nilai yang diformat dengan menggunakan string format kustom yang menyertakan tempat penampung nol.

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

Atau

29255.0.ToString("N1")

hasil "29.255.0"

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

Atau

29255.0.ToString("N2")

hasil "29.255,00"

Yitzhak Weinberg
sumber
jawaban yang bagus tapi bagaimana dengan 29.255,00?
Roxy'Pro
@ Roxy'Pro Mengubah lokal / budaya?
Maarten Bodewes
@ MaartenBodewes saya pikir ada surat yang sesuai seperti "N1", "F1" atau pertanda seperti itu =) Tapi budaya chaning pasti akan berfungsi dengan baik ..
Roxy'Pro
11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));
p.campbell
sumber
3
Atau Console.WriteLine ("{0: #, #}", num); jika Anda hanya ingin mencetaknya. Tapi string.Format (...) lebih berguna kurasa.
Indy9000
11

Lebih sederhana, menggunakan interpolasi string, bukan String.Format

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

atau menggunakan Variabel Anda

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

Misalnya String.Format("{0:0,0}", 1);mengembalikan 01, bagi saya tidak valid

Ini bekerja untuk saya

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

output 19.950.000

cmujica
sumber
8

Perhatikan bahwa nilai yang Anda format harus berupa angka. Tampaknya tidak akan membutuhkan representasi string dari angka dan format dengan koma.


sumber
5
String.Format("0,###.###"); also works with decimal places
Abolfazl Rastgou
sumber
5

C # 7.1 (mungkin sebelumnya?) Menjadikan ini mudah dan terlihat bagus seperti seharusnya, dengan interpolasi string:

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

Anda dapat menggunakan fungsi seperti ini untuk memformat angka dan meneruskan tempat desimal yang diinginkan. Jika tempat desimal tidak ditentukan akan menggunakan dua tempat desimal.

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

Saya menggunakan desimal tetapi Anda dapat mengubah jenisnya ke yang lain atau menggunakan objek anonim. Anda juga bisa menambahkan pengecekan error untuk nilai tempat desimal negatif.

dunwan
sumber
-2

Metode yang saya gunakan untuk tidak khawatir lagi tentang budaya dan potensi masalah pemformatan adalah bahwa saya memformatnya sebagai mata uang dan mengeluarkan simbol mata uang setelahnya.

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

{
  formattedValue = result.ToString("C").Substring(1);
}
8 John Volante
sumber
6
Kode ini tidak bebas kultur - kode ini akan menggunakan kultur bawaan apa pun yang diset pada mesin yang menjalankan kode. Ini dapat membuat output yang tidak diinginkan di mana budaya itu menempatkan simbol mata uang mereka di akhir angka daripada awal (misalnya fr-FR), atau menggunakan lebih dari satu karakter untuk menunjukkan mata uang (misalnya da-DK), atau tidak memisahkan ribuan menggunakan koma (misalnya sebagian besar dari daratan Eropa).
raveturned
-2

Di bawah ini adalah solusi yang bagus di Jawa!

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

atau untuk cara yang lebih kuat Anda mungkin ingin mendapatkan lokal tempat tertentu, kemudian gunakan seperti di bawah ini:

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

OUTPUT Lokal AS : $ 9.999.999,00

Output Lokal Jerman

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

OUTPUT: 9.999.999,00 €

Output Lokal India

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

OUTPUT: Rs.9.999.999,00

Output Lokal Estonia

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

OUTPUT: 9 999 999 €

Seperti yang dapat Anda lihat di keluaran yang berbeda, Anda tidak perlu khawatir pemisah menjadi koma atau titik atau bahkan ruang, Anda bisa mendapatkan nomor yang diformat sesuai dengan standar i18n

Anirudh
sumber
1
di mana Anda menggunakan variabel locale ??
Smith
terlihat dengan benar, apakah itu benar untuk digunakan saat mendapatkan contoh mata uang seperti: NumberFormat fmt = NumberFormat.getCurrencyInstance (lokal); memperbaiki kode, terima kasih!
Anirudh
3
Sudahkah Anda memeriksa tag? Pertanyaannya adalah tentang C # bukan Java!
Salar
-3

Jika Anda ingin menampilkannya di DataGridview, Anda harus mengubah tipenya, karena defaultnya adalah String dan karena Anda mengubahnya menjadi desimal dianggap sebagai Angka dengan titik mengambang

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
Ali
sumber