Почему System.Convert ("0") генерирует исключение FormatException в некоторых системах? - PullRequest
2 голосов
/ 16 декабря 2010

Код скомпилирован в VS2008 для .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)

Ответы [ 6 ]

5 голосов
/ 16 декабря 2010

Я помню эту проблему из вопроса некоторое время назад. На методы Parse () влияют переопределения пользователя в апплете «Панель управления + регион и язык». IIRC, он особенно чувствителен к настройке «Символ отрицательного знака». Попросите пользователя исправить там настройки.

Ссылочный вопрос здесь .

4 голосов
/ 16 декабря 2010

Если ваша проблема связана с текущей культурой, попробуйте преобразовать в Double с использованием инвариантной культуры:

Convert.ToDouble("0", System.Globalization.CultureInfo.InvariantCulture);
1 голос
/ 16 декабря 2010

Довольно легко доказать, что это не из-за кода (или CultureInfo), я могу доказать, что для всех культур в .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 голосов
/ 16 декабря 2010

Вероятно, виноват экземпляр CurrentCulture CultureInfo. Convert.ToDouble вызов, в конце концов, просто возвращает результат Double.Parse .Это, как задокументировано, использует NumberFormatInfo текущей культуры, чтобы разобраться.

0 голосов
/ 16 декабря 2010

Не думаю, что происходит сбой при вводе 0.

Конечно, произойдет сбой при вводе чего-либо, кроме числа.Это означает, что произойдет сбой, если вы введете пустую строку (другими словами, просто нажмите Enter).Я предполагаю, что это то, что вы испытываете.

Ваш код будет работать (только для чисел), если вы измените его на:

string str = "";
do
{
    str = Console.ReadLine();
    if(!string.IsNullOrEmpty(str))
        Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
}
while (str != "");
0 голосов
/ 16 декабря 2010

Это может быть связано с настройками культуры. Как я знаю, в некоторых настройках культуры вы должны ввести 0.0, чтобы иметь возможность преобразовать в double

...