Почему System.convert («0») бросает Formatexception в некоторые системы?

StackOverflow https://stackoverflow.com/questions/4461709

  •  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. Анкет Это, как задокументировано, использует номером текущей культуры, чтобы выяснить вещи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top