2009-10-13 97 views

Trả lời

28

Tôi nghĩ:

string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", 4.3); 

nên làm những gì bạn muốn.

+3

cũng sẽ xử lý hàng nghìn lượt cũng được thực hiện khác nhau. – dove

+3

Nhưng nó có những bất lợi mà bạn phải tự chèn thông tin văn hóa trong MỌI ToString, String.Format, Number.Parse và phương pháp tương tự trong mã của bạn. – Foxfire

+0

Nó giúp cho một trường hợp cụ thể nhưng không cho phép chỉ định dấu thập phân. –

2

Định dạng số theo mặc định sử dụng NumberFormatInfo từ CultureInfo hiện tại, để nó hiển thị bằng cách sử dụng cài đặt khu vực trên máy tính.

Vì vậy, bạn không thực sự cần phải làm bất cứ điều gì đặc biệt về nó, ngoại trừ có thể đảm bảo rằng đúng CultureInfo đang được sử dụng.

Đối với câu hỏi, có chuỗi không hợp lệ. Dấu "," biểu thị dấu nghìn chữ, không phải dấu phân cách thập phân. Hãy xem NumberFormatInfo và custom number formats.

3

Để có giải pháp tổng quát hơn, bạn có thể set the thread's UI culture đối với văn hóa mà bạn bè châu Âu của bạn sử dụng. Điều này sẽ ảnh hưởng đến việc trình bày các con số, tiền tệ, ngày tháng, vv

1

Sử dụng một CultureInfo có dấu phẩy thay vì dấu thập phân (tiếng Pháp chẳng hạn):

string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3); 
30
NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = ","; 
nfi.NumberGroupSeparator = "."; 

double num = 4.3; 
string ret = num.ToString(nfi); // 4,3 
+1

@James: ngoại trừ việc nó khá vô ích vì hỗ trợ văn hóa được tích hợp vào .NET. Tốt hơn để làm điều này theo cách được hỗ trợ hơn là phát minh lại nó. –

+2

@Mats: Và điều gì sẽ xảy ra nếu bạn quyết định chọn một đối tượng 'CultureInfo' tùy ý của châu Âu (ví dụ:" de-DE "hoặc" fr-FR ") và văn hóa đó đã được tùy chỉnh để sử dụng dấu tách thập phân khác? Tôi biết đó là một kịch bản không chắc nhưng nó có thể xảy ra. Sử dụng mã của tôi, bạn sẽ luôn nhận được một ',' làm dấu tách thập phân, bất kể bất kỳ tùy chỉnh nào. – LukeH

+0

Nhưng bạn không muốn nhận được một ',' luôn luôn, bạn muốn định dạng chuỗi theo cài đặt khu vực của người dùng (bao gồm cả cài đặt tùy chỉnh của họ). – Groo

9

Điều này phụ thuộc vào những gì bạn muốn làm. Nếu bạn muốn làm cho toàn bộ ứng dụng của mình sẵn sàng cho một số đầu ra ngôn ngữ khác chỉ cần sử dụng

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("de-DE"); 

Nếu bạn muốn có một ứng dụng ngôn ngữ hỗn hợp (có nghĩa là một số đầu ra được định dạng bằng một ngôn ngữ khác) bạn có sử dụng quá tải của các chức năng Chuỗi cụ thể như:

var culture = System.Globalization.CultureInfo.GetCultureInfo("de-DE"); 
String.Format (culture, "{0:0.0}", 4.3); 

Phương pháp đầu tiên được ưu tiên nếu có thể vì bạn chỉ cần một dòng trong ứng dụng và mọi thứ sẽ như mong đợi. Trong phần thứ hai, bạn phải thêm tham số culture vào mọi phương thức ouput String trong toàn bộ ứng dụng của bạn.

+0

Đó là một câu trả lời tuyệt vời. Bạn có biết nếu điều này là settable thông qua một tập tin cấu hình? – Greg

+0

@Greg *** toàn cầu hóa phần *** trong ASP.NET, không phải trong WinForms, giao diện điều khiển ứng dụng, tôi nghĩ. – Kiquenet

1

Có, bạn đang sử dụng sai chuỗi và cũng không thể giải quyết sự cố bằng cách chỉ cung cấp chuỗi định dạng.

Chuỗi định dạng của bạn là định dạng số bằng mẫu "0", sau đó căn chỉnh theo chiều dài 0.

Khi bạn chỉ định dấu tách thập phân trong chuỗi định dạng, nó luôn là dấu chấm bất kể văn hóa hiện tại. Dấu tách thập phân trong kết quả của định dạng mặt khác luôn là dấu phân tách được sử dụng bởi văn hóa hiện tại. Vì vậy, để có dấu phẩy như dấu phân cách thập phân trong kết quả, bạn phải đảm bảo rằng văn hóa được sử dụng cho định dạng là một dấu phẩy dùng dấu phẩy thập phân.

Bạn có thể thiết lập các nền văn hóa hiện hành đối với các chủ đề để nó được sử dụng bởi mặc định bằng cách định dạng, hoặc chỉ định một nền văn hóa trong cuộc gọi:

string ret = String.Format(CultureInfo.GetCultureInfo(1053), "{0:0.0}", 4.3); 
0

Cài đặt nền văn hóa chủ đề sẽ tự động làm chuyển đổi này. Tuy nhiên, nếu bạn muốn định dạng này với một chuỗi tùy chỉnh, bạn có thể làm như sau:

string ret = string.Format("{0:0.00}", 4.3); 

hoặc

string ret = (4.3f).ToString("0.00"); 

Các "" là trình định dạng định dạng cho dấu thập phân cho văn hóa hiện tại. Thông tin thêm cho các định dạng số tùy chỉnh được tìm thấy tại địa chỉ: http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

Bạn luôn có thể kiểm tra những ký tự cho điểm thập phân là với:

string decimalChar = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; 
0

Số định dạng có thể được xử lý cho bạn bằng cách khuôn khổ nếu bạn sử dụng đúng culture khi thao tác số.

Console.WriteLine(4.3); 

Console.WriteLine(4.3.ToString(CultureInfo.GetCultureInfo("fr-fr"))); 

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr"); 
Console.WriteLine(4.3); 

Nếu bạn muốn hiển thị "một lần", phương pháp thứ hai sẽ hoạt động. Nếu bạn muốn hiển thị mọi số một cách chính xác, bạn thực sự nên cài đặt current thread's culture. Bằng cách đó, bất kỳ thao tác số nào sẽ xử lý dấu phân cách thập phân, nhóm các ký tự và mọi thứ cụ thể về văn hóa khác một cách chính xác.

Cũng vậy với việc phân tích cú pháp số. Nếu người dùng nhập 1,234, làm cách nào để biết liệu họ đã nhập 1.234 (dấu phẩy là dấu tách thập phân) hay 1234 (dấu phẩy là dấu tách nhóm)? Đây là nơi các nền văn hóa giúp ra như nó biết làm thế nào để hiển thị con số và cũng có thể được sử dụng để phân tích chúng một cách chính xác:

Console.WriteLine(double.Parse("1,234")); 

Console.WriteLine(double.Parse("1,234", CultureInfo.GetCultureInfo("fr-fr"))); 

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr"); 
Console.WriteLine(double.Parse("1,234")); 

Ý chí trên đầu ra 1234 (dấu phẩy là một dấu phân cách thập phân trong tôi en-us văn hóa mặc định), 1.234 (dấu phẩy là dấu phân cách thập phân bằng tiếng Pháp) và 1,234 (dấu phẩy là dấu phân tách thập phân bằng tiếng Pháp và văn bản của chuỗi được đặt thành tiếng Pháp để hiển thị bằng văn bản này - do đó dấu phẩy là dấu tách thập phân ở đầu ra).

Các vấn đề liên quan