1

最近新しい仕事があり、顧客からソフトウェアのエラーに関する質問を受けました。エラーは、「文字列 '0.5' から型 'double' への変換は無効です」です。

問題のある行を見つけたと思います。顧客はフランスにいて、コンピューターの設定がすべてフランス語 (番号付けシステム、言語など) であるため、"0.5" を "0,5" のフランス語の数値バージョンにキャストすることはできません。フランスのシステムには小数点がありません。数のどこにでも。そのため、string.format が「0.5」を検出した場合、「.」がないため、何をすべきかわかりません。フランス文化の設定で二重にキャストされるキャラクター。私はここにいますか?

context.Append(String.Format("{0} {1} exceeds fine {2} limit of {3:N0}", _
       context.OccupancyState, context.Size, _
       Reg.Alert.ToLower, context.Limit))

context.Size は「0.5」文字列を保持します。

format.string はカルチャ設定を考慮に入れていますか、それともここで何か不足していますか?

編集:

フランスのWindows VMで試してみたところ、(残念ながら)「0,5」として正常に解析できました...おそらくそれは問題ではありませんか?

4

3 に答える 3

2
CultureInfo culture = new CultureInfo("en-US");
context.Append(String.Format(culture, "{0} {1} exceeds fine {2} limit of {3:N0}", _
       context.OccupancyState, context.Size, _
       Reg.Alert.ToLower, context.Limit))
于 2013-02-01T22:35:49.817 に答える
1

文字列の書式設定と解析ではコンピューターのカルチャ/ロケールが考慮されるため、すべての数値が小数点付きで出力され、同じ形式で入力されることがわかっている場合は、不変のカルチャを書式設定と解析に渡す必要があります。メソッド。

文字列「0.5」context.Sizeを保持していると言いますが。これは 2 番目の引数であるため意味がなく、string.Format 内の を置き換えます。{1}

おそらく間違っているのは、コードがフォーマットcontext.Limitで出力するために10進数にしようとしているということです。{3:N0}この文字列が「0.5」の場合フランスのマシン (または小数点のコンマがある PC) ではエラーが発生します。これは、その形式の有効な数値ではないためです。

したがって、数値を数値として保存するか、既にフォーマットされている文字列を数値としてフォーマットしようとしないでください。

于 2013-02-01T22:37:05.197 に答える
0

最初に文字列を double に変換する必要があります。そうしないString.Formatと、書式設定なしで文字列が連結されます。

double d = double.Parse(context.Size, CultureInfo.InvariantCulture);
string formatted = String.Format("{0} {1} exceeds fine {2} limit of {3:N0}"
                                 , context.OccupancyState, context.Size
                                 , Reg.Alert.ToLower, context.Limit);

double を文字列に再度フォーマットするときにstring.Format使用されるようになりました。System.Globalization.CultureInfo.CurrentCulture

于 2013-02-01T22:34:50.467 に答える