Разобрать немецкую строку валюты как десятичную - PullRequest
2 голосов
/ 10 февраля 2020

Это консольное приложение. NET Core 3.1, которое я создал, чтобы продемонстрировать проблему в большой библиотеке классов. Я запускаю его на Windows 10 сборке 18362

static void Main(string[] args)
{
    string cur = "19,99 €";
    CultureInfo ci = new CultureInfo("de-DE");
    decimal num = decimal.Parse(cur, NumberStyles.Any, ci.NumberFormat);
}

Почему строка decimal num = decimal.Parse(cur, NumberStyles.Any, ci.NumberFormat); throw

System.FormatException: 'Входная строка была неверна формат. '

РЕДАКТИРОВАТЬ

Я добавил строку

Debug.WriteLine(JsonConvert.SerializeObject(ci.NumberFormat, Formatting.Indented))

Вывод

{
  "CurrencyDecimalDigits": 2,
  "CurrencyDecimalSeparator": ",",
  "IsReadOnly": false,
  "CurrencyGroupSizes": [
    3
  ],
  "NumberGroupSizes": [
    3
  ],
  "PercentGroupSizes": [
    3
  ],
  "CurrencyGroupSeparator": ".",
  "CurrencySymbol": "€",
  "NaNSymbol": "NaN",
  "CurrencyNegativePattern": 8,
  "NumberNegativePattern": 1,
  "PercentPositivePattern": 0,
  "PercentNegativePattern": 0,
  "NegativeInfinitySymbol": "-∞",
  "NegativeSign": "-",
  "NumberDecimalDigits": 2,
  "NumberDecimalSeparator": ",",
  "NumberGroupSeparator": ".",
  "CurrencyPositivePattern": 3,
  "PositiveInfinitySymbol": "∞",
  "PositiveSign": "+",
  "PercentDecimalDigits": 2,
  "PercentDecimalSeparator": ",",
  "PercentGroupSeparator": ".",
  "PercentSymbol": "%",
  "PerMilleSymbol": "‰",
  "NativeDigits": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9"
  ],
  "DigitSubstitution": 1
}

РЕДАКТИРОВАТЬ 2 Этот код работает без исключения, когда значение немецкой валюты вводится напрямую. Однако, когда значение копируется из входного потока, который предоставляет значения в немецкой валюте, возникает исключение. Я попытался перебрать

foreach (char c in cur)
{
    System.Diagnostics.Debug.WriteLine(Char.GetNumericValue(c));
}

с точкой останова в l oop, но c всегда один из 19,99 €

Как мне найти, какие символы вызывают

System.FormatException

для выброса?

EDIT 3 Поток ввода, который содержит немецкую валюту со скрытым символом, поступает из Магазина Microsoft,

StoreProduct.Price.FormattedPrice

В строке «19,99 €» добавлен символ Unicode 160, неразрывный пробел. Удаляя это согласно { ссылка } с

cur = Regex.Replace(cur, @"[^\u001F-\u007F]", string.Empty);

Проблема исчезает.

...