.NET String.Format () để thêm dấu phẩy ở hàng nghìn vị trí cho một số


852

Tôi muốn thêm dấu phẩy ở hàng nghìn vị trí cho một số.

String.Format()?

Câu trả lời:


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);cũng hoạt động không có vị trí thập phân.
Greg Bray

9
Làm cách nào tôi có thể sao chép chỉ định "N" nhưng có nhiều chữ số thập phân như trong số?
Stephen Drew

56
@Justin: Theo msdn.microsoft.com/en-us/l Library / 0c899ak8.aspx , ',' (và '.') Được thay thế bằng các ký tự được bản địa hóa chính xác.
Roger Lipscombe

@RogerLipscombe Tôi đã không nhận ra điều đó
Justin

6
@VVVV - thì có lẽ bạn đang chuyển qua một chuỗi thay vì một số . Nếu bạn có một chuỗi, trước tiên bạn cần chuyển đổi thành float hoặc double. Hãy thửstring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

379

Tôi thấy đây là cách đơn giản nhất:

myInteger.ToString("N0")

1
Bạn cũng có thể sử dụng nó với chuỗi.Format, như trong chuỗi.Format ("Đây là một số có dấu phẩy và không có số thập phân, {0: N0}", 123456789 (;
Dan Morp4

16
không nên là myInteger.ToString ("N0") ... string.tostring tôi không nghĩ sẽ hoạt động.
Taylor Brown

1
Tôi biết đã 5 năm rồi, nhưng cảm ơn! Nó hoạt động cho số> 4 ký tự và <4 ký tự.
AskYous

@AskYous - Chà, nó cũng hoạt động cho 4 ký tự .. Cũng có thể nói nó hoạt động với mọi độ dài.
Broots Waymb

Điều này đang hoạt động nhưng nó đang thay đổi trên các thiết lập khu vực
saulyasar 27/03/18

149
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000

27
Giải pháp này không tốt theo quan điểm quốc tế hóa - các nền văn hóa khác sử dụng các ký tự khác hơn ,là một dấu phân cách hàng nghìn, ví dụ như một khoảng trắng hoặc thậm chí ..
Justin

6
Hoạt động cảm ơn + 1. Đã mở rộng để hiển thị tối đa 2 dp.ToString ("#, ## 0. ##")
Crab Buck

8
@MacSigler Điều đó thực sự không đúng, hãy xem nhận xét của Roger Lipscombe về câu trả lời ở trên: String.Format sẽ tự động áp dụng nội địa hóa.
Dan Bechard

10
@MacSigler Đó là điều mặc dù, mã này không phải lúc nào cũng in ra dấu phẩy. Chỉ khi văn hóa là một thứ mong đợi dấu phẩy (ví dụ en-US hoặc bất biến). Nếu văn hóa là một thứ mong đợi một dấu phân cách khác (ví dụ .), .NET sẽ tự động thay thế dấu phẩy bằng dấu phân cách đó. Một lần nữa, tôi khuyên bạn nên đọc liên kết được đăng bởi Roger nếu bạn vẫn không hiểu tại sao lại như vậy.
Dan Bechard

4
@MacSigler Nhận xét của Justin vẫn đúng ở chỗ nếu bạn không ép buộc văn hóa phải en-US, nó sẽ kế thừa cài đặt văn hóa từ máy cục bộ. Hiểu biết của tôi là biên dịch mã ở trên, sau đó chạy nó trên hai máy có nền văn hóa khác nhau (với các dấu tách số khác nhau) sẽ tạo ra kết quả khác nhau. Nếu bạn muốn nó luôn tạo ra dấu phẩy, bạn cần đặt rõ ràng một nền văn hóa sử dụng dấu phẩy (ví dụ: bất biến).
Dan Bechard

98

Nếu bạn muốn văn hóa cụ thể, bạn có thể muốn thử điều này:

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

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

Lưu ý: Một số nền văn hóa sử dụng ,có nghĩa là thập phân hơn .là cẩn thận.


77

Các định dạng tiêu chuẩn, với đầu ra liên quan của chúng,

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

Ví dụ đầu ra (văn hóa en-us):

(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
Câu trả lời này đóng gói rất nhiều thông tin hữu ích. Học bằng ví dụ bây giờ tôi thấy 0 và 1 có nghĩa gì trong định dạng chuỗi.
user420667

41

Đây là định dạng tốt nhất. Hoạt động trong tất cả các trường hợp:

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
Điều gì sẽ xảy ra nếu tôi muốn các dấu chấm như dấu phân cách nghìn và dấu phẩy là dấu phân cách thập phân?
FrenkyB

được nâng cấp bởi vì nó không hiển thị 12,314.0 (như định dạng n1) nhưng 12.314 :)
NDUF

34
String.Format("{0:#,###,###.##}", MyNumber)

Điều đó sẽ cung cấp cho bạn dấu phẩy tại các điểm có liên quan.


10
Phương thức ": n" tốt hơn vì nó phải tôn trọng ngôn ngữ của người dùng.
Torlack

12
Điều này là đúng, nhưng nó không được đảm bảo để cung cấp cho bạn dấu phẩy ở điểm nghìn vì nó tôn trọng ngôn ngữ của người dùng.
Stephen Wrighton

2
quay lại ngay với bạn: đó là sự thật, nhưng điều đó không được đảm bảo để tôn trọng ngôn ngữ của người dùng vì nó sử dụng dấu phẩy làm dấu phân cách hàng nghìn. (Ví dụ: ở Bồ Đào Nha, dấu phẩy thay vào đó là dấu phân cách thập phân.)
ANeves

1
Nếu bạn muốn thực thi các giá trị sau. bạn cần thay # bằng 0. msdn.microsoft.com/en-us/l Library / 0c899ak8 (v = vs.110) .aspx : Zero thay thế số 0 bằng chữ số tương ứng nếu có; mặt khác, số 0 xuất hiện trong chuỗi kết quả trong khi ký hiệu "#" được thay thế bằng chữ số tương ứng nếu có; mặt khác, không có chữ số xuất hiện trong chuỗi kết quả.
Clarice Bouwer

phương pháp này hoạt động tốt với yêu cầu của tôi, trang msDN về phương thức Int32.ToString sẽ là nơi chính nó sẽ được sử dụng msdn.microsoft.com/en-us/l Library / 8wch342y.aspx không hữu ích cho việc này ứng dụng
stackuser83

33

Câu trả lời được bình chọn nhiều nhất là tuyệt vời và đã hữu ích trong khoảng 7 năm. Với sự ra đời của C # 6.0 và cụ thể là Nội suy chuỗi, gọn gàng hơn và, IMO an toàn hơn, cách thực hiện những gì đã được yêu cầu 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

Trường hợp biến i được đặt thay cho trình giữ chỗ (tức là {0}). Vì vậy, không cần phải nhớ đối tượng đi đến vị trí nào. Định dạng (nghĩa là :n) không thay đổi. Để biết tính năng hoàn chỉnh của những gì mới, bạn có thể truy cập trang này .


29

chỉ đơn giản như thế này:

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

thêm thông tin ở đây


21

Nếu bạn muốn sử dụng dấu phân cách "," bất kể văn hóa (ví dụ như trong dấu vết hoặc thông điệp tường trình), đoạn mã sau sẽ hoạt động và có thêm lợi ích là nói với anh chàng tiếp theo tình cờ biết chính xác những gì bạn đang làm.

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

đặt định dạng thành "19,400,320"


21

Ví dụ sau hiển thị một số giá trị được định dạng bằng cách sử dụng các chuỗi định dạng tùy chỉnh bao gồm các trình giữ chỗ bằng không.

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

Hoặc là

29255.0.ToString("N1")

kết quả "29.255.0"

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

Hoặc là

29255.0.ToString("N2")

kết quả "29.255,00"


Câu trả lời hay nhưng 29.255,00 thì sao?
Roxy'Pro

@ Roxy'Pro Thay đổi ngôn ngữ / văn hóa?
Maarten Bodewes

@MaartenBodewes Tôi nghĩ rằng có chữ cái tương ứng như "N1", "F1" hoặc smth như thế =) Nhưng văn hóa
chaning

11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));

3
Hoặc Console.WriteLine ("{0: #, #}", num); nếu bạn chỉ muốn in nó Nhưng tôi đoán chuỗi.Format (...) hữu ích hơn.
Indy9000

11

Đơn giản hơn, sử dụng phép nội suy chuỗi thay vì String.Format

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

hoặc sử dụng Biến của bạn

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

9

Ví dụ String.Format("{0:0,0}", 1);trả về 01, đối với tôi không hợp lệ

Điều này làm việc cho tôi

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

sản lượng 19.950.000


8

Lưu ý rằng giá trị mà bạn định dạng phải là số. Không có vẻ như nó sẽ có một chuỗi đại diện cho một số và định dạng bằng dấu phẩy.



5

C # 7.1 (có lẽ sớm hơn?) Làm cho điều này dễ dàng và đẹp mắt như mong muốn, với phép nội suy chuỗi:

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

3

Bạn có thể sử dụng một hàm như thế này để định dạng số và tùy ý chuyển vào vị trí thập phân mong muốn. Nếu vị trí thập phân không được chỉ định, nó sẽ sử dụng hai vị trí thập phân.

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

Tôi sử dụng số thập phân nhưng bạn có thể thay đổi loại thành bất kỳ loại nào khác hoặc sử dụng một đối tượng ẩn danh. Bạn cũng có thể thêm kiểm tra lỗi cho các giá trị thập phân âm.


-2

Phương pháp tôi đã sử dụng để không còn lo lắng về văn hóa và các vấn đề định dạng tiềm năng là tôi đã định dạng nó dưới dạng tiền tệ và lấy biểu tượng tiền tệ sau đó.

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

{
  formattedValue = result.ToString("C").Substring(1);
}

6
Mã này không độc lập về văn hóa - nó sẽ sử dụng bất kỳ văn hóa mặc định nào được đặt trên máy đang chạy mã. Điều này có thể tạo ra đầu ra không mong muốn trong đó văn hóa đặt ký hiệu tiền tệ của họ ở cuối số thay vì bắt đầu (ví dụ fr-FR) hoặc sử dụng nhiều hơn một ký tự để biểu thị tiền tệ (ví dụ da-DK) hoặc không tách hàng nghìn bằng dấu phẩy (ví dụ: của lục địa châu Âu).
quay lại vào

-2

Dưới đây là một giải pháp tốt trong Java!

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

hoặc cho một cách mạnh mẽ hơn, bạn có thể muốn có được địa điểm của một địa điểm cụ thể, sau đó sử dụng như dưới đây:

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

Địa điểm Hoa Kỳ ĐẦU RA: $ 9,999.999,00

Sản lượng địa phương Đức

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

ĐẦU RA: 9,999.999,00 €

Sản lượng địa phương Ấn Độ

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

ĐẦU RA: .9.999.999,00

Sản lượng địa phương tiếng Estonia

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

ĐẦU RA: 9 999 999 €

Như bạn có thể thấy trong các đầu ra khác nhau, bạn không phải lo lắng về dấu phân cách là dấu phẩy hoặc dấu chấm hoặc thậm chí là khoảng trắng, bạn có thể lấy số được định dạng theo tiêu chuẩn i18n


1
bạn đã sử dụng biến ở đâu locale ??
Smith

phát hiện chính xác, liệu nó có được sử dụng trong khi lấy ví dụ tiền tệ như: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); Sửa mã, cảm ơn!
Anirudh

3
Bạn đã kiểm tra các thẻ? Câu hỏi là về C # không phải Java!
Salar

-3

Nếu bạn muốn hiển thị nó trong DataGridview, bạn nên thay đổi loại của nó, vì mặc định là Chuỗi và vì bạn thay đổi nó thành số thập phân nên nó được coi là Số có dấu phẩy động

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
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.