Десятичный анализ
Строковое значение "90-"
. Почему десятичное синтаксическое разборку это как "-90"
, но double
выдает a FormatException
?
var inputValue= "90-";
Console.WriteLine(decimal.Parse(inputValue));
Console.WriteLine(double.Parse(inputValue));
Ответы
Ответ 1
Перегрузка decimal.Parse(string s)
по умолчанию вызывается с помощью NumberStyle NumberStyles.Number
, которая определяется как:
Указывает, что AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint и Используются стили AllowThousands. Это стиль составного номера.
Обратите внимание, что AllowTrailingSign
включен. Если вы хотите настроить поведение, вы должны явно вызвать перегрузку, которая позволяет указать стиль номера и адаптировать его к вашим потребностям.
Ответ 2
Реализация различается между двумя:
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);
}
где
NumberStyles.Float = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign |
AllowDecimalPoint | AllowExponent,
NumberStyles.Number = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign |
AllowDecimalPoint | AllowThousands
Итак, decimal.Parse
допускает завершающие знаки, но double.Parse
не работает.
Похоже, что документация в MSDN неточна:
Параметр s содержит номер формы:
[WS] [знак] [цифра,] цифра [.fractional цифры] [WS]
Он должен указывать на то, что завершающий знак также действителен.
Ответ 3
Интересно, что по умолчанию decimal
и double
используют разные стили чисел:
http://msdn.microsoft.com/en-us/library/cafs243z.aspx
Параметр s интерпретируется с использованием стиля NumberStyles.Number. Это означает, что разрешены пробелы и разделители тысяч, но символы валюты не являются.
http://msdn.microsoft.com/en-us/library/fd84bdyt (v = vs .110).aspx
Параметр s интерпретируется с использованием комбинации флагов NumberStyles.Float и NumberStyles.AllowThousands. Это означает, что, например, допустимы пробелы и разделители тысяч, в то время как символы валют - нет.
Это не сразу видно из этих описаний, но если вы посмотрите на него, NumberStyles.Number
позволяет остановить знак:
http://msdn.microsoft.com/en-us/library/system.globalization.numberstyles.aspx
Указывает, что используются стили AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint и AllowThousands. Это стиль составного номера.
Предположительно разница в значениях по умолчанию заключается в том, что decimal
часто используется для расчета валюты.
Конечно, в обоих случаях вы можете предоставить свой собственный формат номера, указав именно то, что вы делаете, и не хотите принимать, чтобы вы могли сделать их согласованными для вашего собственного использования.