Почему System.convert («0») бросает Formatexception в некоторые системы?
-
10-10-2019 - |
Вопрос
Код составлен в VS2008 Targeting .net3.5. Это не воспроизводимо в моей системе. Я подозреваю, что какая -то настройка локализации в игре, но я мало что знаю об этом.
Все остальные действительные цифры, кажется, работают нормально. Ошибка проиллюстрирована этим кодом (который вызывает такое же исключение, но не является производственным кодом):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string str = "";
do
{
str = Console.ReadLine();
Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
}
while (str != null);
}
}
}
В командной строке ввод «0» сбивает приложение по крайней мере в одной системе, с которой я столкнулся.
Степенный трассировку с пользовательского ПК:
System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info)
at System.Convert.ToDouble(String value)
Решение
Я помню эту проблему из вопроса некоторое время назад. Методы Parse () влияют на переопределение пользователя в панели управления + регион и языковом апплете. IIRC, он особенно чувствителен к настройке «Символа негативного знака». Попросите вашего пользователя исправить настройки там.
Справочный вопрос это здесь.
Другие советы
Если ваша проблема связана с текущей культурой, попробуйте преобразовать, чтобы удвоить инвариантную культуру:
Convert.ToDouble("0", System.Globalization.CultureInfo.InvariantCulture);
Довольно легко доказать, что это не из -за кода (или культуры), я могу доказать, что для всех культур в .net, строки «0» можно преобразовать в правильное дважды.
string inputNumber = "0";
foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
try
{
double d = Convert.ToDouble(inputNumber, culture);
}
catch
{
Console.WriteLine(culture.Name);
}
}
Console.WriteLine("end");
Console.Read();
Это не выводит ничего, кроме «конца».
Это может быть связано с настройками культуры. Как я знаю в некоторых настройках культуры, вы должны ввести в 0,0, чтобы иметь возможность конвертировать в дважды
Я не думаю, что это сбои, когда вы вводите 0
.
Это, конечно, сбой, когда вы введете что -либо, что не является числом. Это означает, что он будет сбой, если вы введете пустую строку (другими словами, просто нажмите Enter). Я полагаю, что это то, что вы испытываете.
Вы код будет работать (только для чисел), если вы измените его на это:
string str = "";
do
{
str = Console.ReadLine();
if(!string.IsNullOrEmpty(str))
Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
}
while (str != "");
Экземпляр текущей культуры культуры, вероятно, виноват. Convert.todouble позвонить, в конце концов, просто возвращает результат Double.parse. Анкет Это, как задокументировано, использует номером текущей культуры, чтобы выяснить вещи.