2014-04-17 15 views
16

Tôi đang viết chuỗi tùy chỉnh cho trình xác thực thập phân cần sử dụng Decimal.TryParse bỏ qua văn hóa (nghĩa là không quan tâm nếu đầu vào chứa "." Hoặc "," làm dấu thập phân dấu phân tách). Đây là phương pháp được đề xuất:Văn bản bất biến Decimal.TryParse()

public static bool TryParse(
    string s, 
    NumberStyles style, 
    IFormatProvider provider, 
    out decimal result 
) 

Tôi không thể xác định được nên sử dụng làm thông số thứ 3. Các ví dụ tôi đã nhìn thấy như sau:

culture = CultureInfo.CreateSpecificCulture("en-GB"); 
Decimal.TryParse(value, style, culture, out number) 

để chúng tạo ra một nền văn hóa cụ thể. CultureInfo không có phương thức "CreateInvariantCulture" và CultureInfo.InvariantCulture không thuộc loại được yêu cầu. Cách sử dụng chính xác là gì?

Trả lời

28

Có cố gắng như thế này:

decimal value; 
bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value); 

Cách tốt nhất có khả năng sẽ được sử dụng các phương pháp Decimal.Parse() như bạn làm theo truyền thống với bất kỳ giá trị chuỗi số thập phân.

Bạn có thể sử dụng NumberStyles.Currency để xác định rằng các giá trị được đọc như tiền tệ, mà sẽ chăm sóc của bất kỳ giá trị tiền tệ liên quan đến (bạn sẽ cần phải thêm một tham chiếu đến System.Globalalization sử dụng này:

using System.Globalization; 

Decimal.Parse cũng chấp nhận một tham số thứ ba, mà sẽ cho phép bạn thiết lập một cách rõ ràng IFormatProvider nếu bạn lựa chọn và muốn bạn một nền văn hoá cụ thể:

decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55 
1

Trong thực tế CultureInfo.InvariantCulture có thể được sử dụng ở đây. Thông số expe cts IFormatProvider, một giao diện thực hiện CultureInfo. Nhưng InvariantCulture là bất biến theo nghĩa là nó không thay đổi theo cài đặt của người dùng.

Trên thực tế, không có nền văn hóa nào chấp nhận , hoặc . làm dấu phân cách thập phân - tất cả đều là một hoặc cái kia. Bạn sẽ phải tìm một số cách khác để xử lý dữ liệu có thể sử dụng một trong các dấu tách thập phân này.

1

Tôi không thể tìm ra những gì sẽ sử dụng làm thông số thứ 3.

Vì tất cả các nền văn hóa NumberDecimalSeparator hoặc NumberGroupSeparator vv .. đều không giống nhau.

ai đó sử dụng . như một NumberDecimalSeparator, ai đó sử dụng , nhưng không có CultureInfo có sử dụng cả hai như là một NumberDecimalSeparator.

CultureInfo triển khai giao diện IFormatProvider. Đó là lý do tại sao nếu bạn chỉ định CultureInfo, chuỗi value của bạn sẽ được phân tích cú pháp trên các quy tắc nền văn hóa đó.

Tôi đang viết chuỗi tùy chỉnh cho trình xác thực thập phân cần sử dụng Thập phân.TryParse mà bỏ qua văn hóa

Trong trường hợp này, bạn có thể sử dụng để sao chép CultureInfo.Clone method trong đó văn hóa bạn muốn (hoặc InvariantCulture) và bạn có thể thiết lập NumberDecimalSeparator và NumberGroupSeparator mà chuỗi bạn muốn.

5

Kẻ xấu của tôi. Tôi đã thử nghiệm mã sau:

 string DutchDecimal = "1,5"; 
     string EnglishDecimal = "1.5"; 
     decimal a; 
     decimal b; 
     Console.WriteLine(decimal.TryParse(DutchDecimal, out a)); 
     Console.WriteLine(a); 
     Console.WriteLine(decimal.TryParse(EnglishDecimal, out b)); 
     Console.WriteLine(b); 
     Console.Read(); 

và nó phân tích cú pháp chính xác cả hai chuỗi. Có vẻ như TryParse mặc định thực sự là bất biến văn hóa. Tôi giả định đây không phải là trường hợp, bởi vì mặc định TypeConversionValidator trong EnterpriseLibrary là văn hóa phụ thuộc và tôi giả định nó chỉ đơn giản là sử dụng TryParse. Tuy nhiên, khi nó quay ra trình phân tích cú pháp mặc định này được mã hóa cứng để sử dụng văn hóa hiện tại.

EDIT: Tôi phát hiện ra rằng "1.5" chuyển đổi thành 1.5 và "1,5" chuyển thành 15. Điều này thực sự đúng cho hành vi bất biến văn hóa, do đó, nó có. Toàn bộ câu hỏi này dường như được sinh ra bởi sự hiểu lầm của tôi về cách thức hoạt động bất biến văn hóa.

+0

Từ [Tài liệu Microsoft] (https://msdn.microsoft.com/en-us/library/9zbda557 (v = vs.110) .aspx) có vẻ như .NET chuyển sang cài đặt hệ thống cục bộ của bạn nếu bạn không chỉ định văn hóa: 'Tham số s được phân tích bằng cách sử dụng thông tin định dạng trong đối tượng NumberFormatInfo được khởi tạo cho văn hóa hệ thống hiện tại.' –

+0

Phân tích cú pháp 1,5 đến 15 không thực sự chính xác, phải không? Nếu ',' là dấu phân cách hàng nghìn thì không được phép ở vị trí 10. Tôi nghĩ rằng phân tích cú pháp 1,5 bằng cách sử dụng phân tích cú pháp bất biến văn hóa sẽ thất bại. –

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