System.convert(“ 0”)がいくつかのシステムにformatexceptionを投げるのはなぜですか?

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

  •  10-10-2019
  •  | 
  •  

質問

コードは、.NET3.5をターゲットとするVS2008でコンパイルされています。これは私のシステムでは再現できません。ある種のローカリゼーション設定が機能しているのではないかと思いますが、それについてはあまり知りません。

他のすべての有効な数字は正常に機能しているようです。バグはこのコードで示されています(これは同じ例外を引き起こしますが、生産コードではありません):

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」の入力が私が遭遇した少なくとも1つのシステムでアプリをクラッシュさせます。

ユーザーのPCからのスタックトレース:

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);

コード(またはCultureInfo)のためではないことを証明するのは非常に簡単です。.NETのすべての文化について、文字列「0」を2倍に正しく変換できることを証明できます。

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 != "");

現在のカルチャーCultureInfoインスタンスは、おそらく責任があります。 convert.todouble 結局のところ、単にの結果を返すだけです double.parse. 。これは、文書化されているように、現在の文化のNumberformatinfoを使用して物事を理解します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top