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


852

Saya ingin menambahkan koma di ribuan tempat untuk nomor.

String.Format()?

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

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

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

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.


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

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

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.


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 .


29

sesederhana ini:

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

info lebih lanjut ada di Sini


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"


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"


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

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}"; 

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


8

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



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}";

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.


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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.