2012-01-16 41 views
7

Tôi muốn biết nếu tôi đang thiếu một cái gì đó hay không ... Tôi đang chạy theo tiêu chuẩn văn hóa Anh vĩ đại.Double.TryParse() bỏ qua NumberFormatInfo.NumberGroupSizes?

Double result = 0; 
if (Double.TryParse("1,2,3", NumberStyles.Any, CultureInfo.CurrentCulture, out result)) 
{ 
    Console.WriteLine(result); 
} 

Sản lượng dự kiến ​​sẽ không là gì ... "1,2,3" không được phân tích cú pháp thành gấp đôi. Tuy nhiên nó có. Theo .NET 2.0 MSDN documentation

AllowThousands Cho biết chuỗi số có thể có nhóm dấu tách; ví dụ, tách hàng trăm từ hàng nghìn. Ký tự phân cách nhóm hợp lệ được xác định bởi các thuộc tính NumberGroupSeparator và CurrencyGroupSeparator của NumberFormatInfo và số chữ số trong mỗi nhóm được xác định bởi thuộc tính NumberGroupSizes và CurrencyGroupSizes của NumberFormatInfo.

Cho phép hàng nghìn được bao gồm trong NumberStyles.Any. NumberGroupSizes là 3 cho văn hóa của tôi. Đây có phải chỉ là một lỗi trong Double.Parse không? có vẻ không chắc nhưng tôi không thể phát hiện ra những gì tôi đang làm sai ....

+0

Đây có thể là lý do tại sao tôi nhận được một kết quả hợp lệ khi kiểm tra [câu trả lời của tôi] (http://stackoverflow.com/questions/1014535/float-parse-doesnt-work-the -way-i-wanted/1014559 # 1014559) về một câu hỏi tương tự. – ChrisF

+0

Chỉ tò mò, nhưng giá trị của kết quả là gì? – Aaron

+0

Tôi nghĩ rằng bạn sẽ phải hỏi Microsoft nếu lỗi của nó nhưng, tôi nhận được hành vi tương tự như bạn. Luôn luôn có thể làm 'NumberStyles.Any^NumberStyles.AllowThousands' nhưng đó không phải là sử dụng nhiều nếu bạn đang mong đợi các nhóm hợp pháp của ba. – Jodrell

Trả lời

5

Nó chỉ có nghĩa là chuỗi đầu vào có thể chứa 0 hoặc nhiều trường hợp NumberFormatInfo.NumberGroupSeparator. Dấu phân cách này có thể được sử dụng để phân tách các nhóm số có kích thước bất kỳ; không chỉ hàng ngàn. NumberFormatInfo.NumberGroupSeparatorNumberFormatInfo.NumberGroupSizes được sử dụng khi định dạng số thập phân dưới dạng chuỗi. Sử dụng Reflector có vẻ như NumberGroupSeparator chỉ được sử dụng để xác định xem ký tự có phải là dấu tách hay không và nếu nó là dấu tách, nó sẽ bị bỏ qua. NumberGroupSizes không được sử dụng.

Nếu bạn muốn xác thực chuỗi, bạn có thể làm như vậy bằng cách sử dụng RegEx hoặc viết một phương thức để làm như vậy. Dưới đây là một tôi chỉ hack với nhau:

string number = "102,000,000.80"; 
var parts = number.Split(','); 
for (int i = 0; i < parts.Length; i++) 
{ 
    var len = parts[i].Length; 
    if ((len != 3) && (i == parts.Length - 1) && (parts[i].IndexOf('.') != 3)) 
    { 
     Console.WriteLine("error"); 
    } 
    else 
    { 
     Console.WriteLine(parts[i]); 
    } 
} 

// Respecting Culture 
static Boolean CheckThousands(String value) 
{ 
    String[] parts = value.Split(new string[] { CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator }, StringSplitOptions.None); 
    foreach (String part in parts) 
    { 
     int length = part.Length; 
     if (CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes.Contains(length) == false) 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+0

+1, xuất hiện 'NumberGroupSizes' bị bỏ qua khi phân tích cú pháp (phương thức nội bộ là' Số.ParseNumber'). – user7116

+0

Tôi chỉ mới bắt đầu đào bới với Reflector nhưng không phải lúc để đi xa như vậy. Tôi đang xem xét sử dụng Regex thực sự, nhưng tôi cần phải cẩn thận và đảm bảo đó là tất cả các văn hóa vẫn còn nhận thức. – Ian

+0

@Ian Bạn có thể xây dựng các biểu thức Regex dựa trên thông tin được lưu trữ trong NumberFormatInfo cho mỗi nền văn hóa. –