2014-04-25 16 views
17

Giá trị chuỗi là "90-". Tại sao số thập phân phân tích cú pháp là "-90" nhưng double ném một số FormatException?Phân tích cú pháp thập phân Số phát hành

var inputValue= "90-"; 
Console.WriteLine(decimal.Parse(inputValue)); 
Console.WriteLine(double.Parse(inputValue)); 
+2

Bạn có nghĩa là có '.TryParse' trong mẫu mã của mình không? – krillgar

+4

câu hỏi hay cho 'Eric Lippert' –

+0

Chúng chỉ chuyển các giá trị mặc định khác nhau cho trình phân tích cú pháp số. Giá trị 'thập phân' được định cấu hình để tìm kiếm các định dạng tiền phổ biến và' double' không phải là. – Gabe

Trả lời

15

Các decimal.Parse(string s) quá tải, theo mặc định, được gọi với NumberStyleNumberStyles.Number được định nghĩa là:

Chỉ ra rằng AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, và AllowThousands phong cách được sử dụng. Đây là kiểu số tổng hợp.

Lưu ý rằng AllowTrailingSign được bao gồm. Nếu bạn muốn tùy chỉnh hành vi thì bạn nên gọi một cách rõ ràng tình trạng quá tải cho phép bạn chỉ định kiểu số và điều chỉnh nó theo nhu cầu của bạn.

4

Thú vị, có vẻ như theo mặc định, decimaldouble sử dụng phong cách số khác nhau:

http://msdn.microsoft.com/en-us/library/cafs243z.aspx

Parameter s được giải thích bằng cách sử dụng phong cách NumberStyles.Number. Điều này có nghĩa là không gian trắng và hàng nghìn dấu phân tách được cho phép nhưng ký hiệu tiền tệ thì không.

http://msdn.microsoft.com/en-us/library/fd84bdyt(v=vs.110).aspx

Các s tham số được giải thích cách sử dụng một sự kết hợp của những lá cờ NumberStyles.Float và NumberStyles.AllowThousands. Điều này có nghĩa là không gian trắng và hàng nghìn dấu phân tách được cho phép, ví dụ, trong khi ký hiệu tiền tệ thì không.

Nó không phải ngay lập tức rõ ràng từ những giới thiệu, nhưng nếu bạn nhìn nó lên, NumberStyles.Number phép trailing dấu:

http://msdn.microsoft.com/en-us/library/system.globalization.numberstyles.aspx

Chỉ ra rằng AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, và các kiểu AllowThousands được sử dụng. Đây là kiểu số tổng hợp.

Có lẽ sự khác biệt trong mặc định là vì decimal thường được sử dụng để tính toán tiền tệ. Tất nhiên, trong cả hai trường hợp, bạn có thể cung cấp định dạng số riêng của bạn chỉ định chính xác những gì bạn làm và không muốn chấp nhận để bạn có thể làm cho chúng phù hợp với mục đích sử dụng của riêng bạn.

8

Việc thực hiện là khác nhau giữa hai:

public static double Parse(String s) { 
    return Parse(s, NumberStyles.Float| NumberStyles.AllowThousands, NumberFormatInfo.CurrentInfo); 
} 

public static Decimal Parse(String s) { 
    return Number.ParseDecimal(s, NumberStyles.Number, NumberFormatInfo.CurrentInfo); 
} 

nơi

NumberStyles.Float  = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | 
         AllowDecimalPoint | AllowExponent, 

NumberStyles.Number = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign | 
         AllowDecimalPoint | AllowThousands 

Vì vậy decimal.Parse phép trailing dấu hiệu nhưng double.Parse không.

Hình như documentation trên MSDN là không chính xác:

Parameter s chứa một số có dạng:

[ws] [dấu hiệu] [chữ số,] chữ số [.fractional-chữ số] [ ws]

Cần chỉ ra rằng dấu hiệu trailing cũng hợp lệ.

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