System.convert(“ 0”)がいくつかのシステムにformatexceptionを投げるのはなぜですか?
-
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を使用して物事を理解します。