2009-04-06 39 views
17

Điều này khiến tôi phát điên. Tôi có chuỗi sau trong một ASP.NET 2.0 WebForm PageDouble.Parse - Vấn đề quốc tế hóa

string s = "0.009"; 

Đủ đơn giản. Bây giờ, nếu văn hóa của tôi là Tây Ban Nha - đó là "es-ES" - và tôi cố gắng để chuyển đổi chuỗi thành đôi, tôi làm như sau:

double d = Double.Parse(s, new CultureInfo("es-ES")); 

những gì tôi mong đợi là 0.009. Thay vào đó, tôi nhận được 9. Tôi hiểu rằng NET nghĩ rằng nó là một dấu phân cách nghìn, mà trong en-US là dấu phẩy, nhưng không nên lấy thông tin văn hóa tôi đi qua phương pháp phân tích cú pháp và áp dụng định dạng đúng chuyển đổi?

Nếu tôi làm

double d = 0.009D; 
string formatted = d.ToString(new CultureInfo("es-ES")); 

định dạng tại là 0009. Có ai không?

+1

Thông tin chi tiết về vấn đề này và nhiều vấn đề khác với bản địa hóa như tại http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

Trả lời

20

lấy văn hóa bạn đã cung cấp và áp dụng định dạng đúng. Bạn đã cung cấp một chuỗi "0,009" và nói với nó rằng đó là tiếng Tây Ban Nha ... sau đó bạn phàn nàn rằng nó đúng cách giải thích nó như tiếng Tây Ban Nha! Đừng nói rằng chuỗi là tiếng Tây Ban Nha khi bạn biết nó không phải là.

Bạn nên vượt qua phương thức Parse văn hóa của chuỗi được phân tích cú pháp, trong trường hợp này là en-US hoặc en-Gb hoặc InvariantCulture.

+0

vâng, tôi hiểu sai. Thanks guys cho câu trả lời. Nó thực sự hữu ích. –

+0

Không sao cả. Tôi luôn sẵn lòng giúp đỡ. Xin lỗi nếu câu trả lời của tôi xuất hiện một chút sắc nét - nó không được dự định theo cách đó nhưng lại đọc nó ngay bây giờ, nó đọc như tôi là một git đúng. –

4

Bạn có nó ngược.

Khi bạn nói double d = Double.Parse(s, new CultureInfo("es-ES"));, bạn đang yêu cầu .NET phân tích chuỗi của bạn thành gấp đôi, giả sử rằng chuỗi được viết trong văn hóa es-ES.

Trong văn hóa Tây Ban Nha, "." là dấu phân cách hàng nghìn, vì vậy "0,00" là 9.

Khi bạn chuyển đổi bằng ToString(), cuối cùng, chuyển đổi 0,009 thành chuỗi bằng văn bản tiếng Tây Ban Nha, vì vậy nó sử dụng dấu "," và bạn nhận được "0,009". Hành vi là chính xác.

Đoán của tôi là bạn muốn sử dụng Double.Parse với Văn bản bất biến và ToString với văn hóa Tây Ban Nha, vì vậy 0,009 trở thành 0,009.

2

Bạn đang nhầm lẫn phân tích cú pháp và định dạng. Bạn nhận được 9 thay vì .009 lần đầu tiên bởi vì bạn lấy một chuỗi được hình thành trong một nền văn hóa dựa trên và phân tích nó bằng cách sử dụng một nền văn hóa dựa trên. Bạn cần phải phân tích nó bằng cách sử dụng bất kỳ nền văn hóa nào được tạo và sau đó định dạng nó bằng bất kỳ nền văn hóa nào bạn muốn hiển thị.

3

Tôi nghĩ rằng bạn đang giải thích nó sai cách, trong văn hóa es-ES 0,009 thực sự chỉ là một cách dài để nói 9, là "." không phải là dấu tách thập phân, vì vậy nếu bạn yêu cầu chuỗi "0,009" là được phân tích cú pháp với văn hóa es-ES, bạn thực sự nên gặp sự cố 9.0. Nếu bạn yêu cầu nó phân tích cú pháp "0,009", bạn sẽ nhận được gấp đôi 0,009.

Tương tự, nếu bạn yêu cầu định dạng số 0,009 bạn sẽ nhận được chuỗi "0,009" trong es-ES.

1
double d = Double.Parse("0,009", 
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
    CultureInfo.CreateSpecificCulture("es-ES")); 

Trong văn hóa es-ES "" là một seporator thập phân (không "")

10

gì viết Jess của việc cho tôi.chỉ dành cho những ai muốn cần phải cố gắng hiểu làm thế nào để có được "văn hóa bất biến": có vẻ này

double d = Double.Parse(myString, CultureInfo.InvariantCulture);

(bài viết đầu tiên stackoverflow, vì vậy yea, thay vì biên;)

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