Десятичный анализ

Строковое значение "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 часто используется для расчета валюты.

Конечно, в обоих случаях вы можете предоставить свой собственный формат номера, указав именно то, что вы делаете, и не хотите принимать, чтобы вы могли сделать их согласованными для вашего собственного использования.