2

コードは、.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)
4

6 に答える 6

5

問題が現在のカルチャに関連している場合は、インバリアント カルチャを使用して Double に変換してみてください。

Convert.ToDouble("0", System.Globalization.CultureInfo.InvariantCulture);
于 2010-12-16T14:26:59.730 に答える
5

しばらく前の質問からこの問題を覚えています。Parse() メソッドは、コントロール パネル + 地域と言語アプレットでのユーザー オーバーライドの影響を受けます。IIRC では、「負号記号」の設定に特に敏感です。そこで設定を修正するようユーザーに依頼します。

参考質問はこちら

于 2010-12-16T15:47:27.590 に答える
1

コード (または CultureInfo) が原因ではないことを証明するのは非常に簡単です。.NET のすべてのカルチャについて、文字列 "0" を double に正しく変換できることを証明できます。

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

それは「終わり」だけを出力します。

于 2010-12-16T14:52:01.397 に答える
0

それは文化設定に関連している可能性があります。私が知っているように、一部のカルチャ設定では、double に変換できるように 0.0 と入力する必要があります。

于 2010-12-16T14:27:31.070 に答える
0

入力してもクラッシュしないと思います0

もちろん、数値以外を入力するとクラッシュします。これは、空の文字列を入力すると (つまり、Enter キーを押すだけで) クラッシュすることを意味します。これがあなたが経験していることだと思います。

これを次のように変更すると、コードが機能します (数値のみ)。

string str = "";
do
{
    str = Console.ReadLine();
    if(!string.IsNullOrEmpty(str))
        Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
}
while (str != "");
于 2010-12-16T14:27:39.797 に答える
0

CurrentCulture CultureInfo インスタンスが原因である可能性があります。Convert.ToDouble呼び出しは、結局のところ、単にDouble.Parseの結果を返します。これは、文書化されているように、現在のカルチャの NumberFormatInfo を使用して物事を把握します。

于 2010-12-16T14:28:09.370 に答える