Это консольное приложение. 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);
Проблема исчезает.