11

私たちは、1 台を除くすべての既知のコンピューターで正常に動作する確立されたソフトウェアを開発しています。問題は、「8」で始まる文字列を解析することです。文字列の先頭にある「8」は予約文字のようです。

Parsing:
int.Parse("8") -> Exception message: Input string was not in a correct format. 
int.Parse("80") -> 0
int.Parse("88") -> 8
int.Parse("8100") -> 100

CurrentCulture: sv-SE 
CurrentUICulture: en-US

問題はint.Parse("8", CultureInfo.InvariantCulture)を使用して解決されます。ただし、問題の原因がわかると便利です。

質問:インバリアント カルチャを指定しないと、この "8" の動作になるのはなぜですか?


追加情報:

上記の結果を達成するための小さなプログラムをクライアントに送信しました。

    private int ParseInt(string s)
    {
        int parsedInt = -1000;
        try
        {
            parsedInt = int.Parse(s);

            textBoxMessage.Text = "Success: " + parsedInt;

        }
        catch (Exception ex)
        {
            textBoxMessage.Text =
                string.Format("Error parsing string: '{0}'", s) + Environment.NewLine +
                "Exception message: " + ex.Message;
        }

        textBoxMessage.Text += Environment.NewLine + Environment.NewLine +
            "CurrentCulture: " + Thread.CurrentThread.CurrentCulture.Name + "\r\n" +
            "CurrentUICulture: " + Thread.CurrentThread.CurrentUICulture.Name + "\r\n";
        return parsedInt;
    }

アップデート

Microsoft Connect データベースのバグであるこのリンクに出くわしました。

https://connect.microsoft.com/VisualStudio/feedback/details/253265/int32-parse-fails-to-convert-the-string-0-zero-on-some-systems

同様の症状で問題があるようですが、本当の根本原因はありません。誰かがこれについて詳しく説明できれば、私は感謝します!

4

1 に答える 1

21

sv-SEカルチャ8が表すため、CurrencyNegativePattern説明したエラーが発生するのはそのためです。

これは、次の例を実行して確認できます。

var ci = new CultureInfo("sv-SE");

var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo));

Console.WriteLine(nfi.CurrencyNegativePattern);
Console.WriteLine(nfi.CurrencyPositivePattern);

これは出力されます:

// 8
// 3

列挙型Parseを受け入れるオーバーロードを使用して、通貨ではなく整数を解析していることを明示的に示すことができます。NumberStyles

Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE"));

今回は、整数を解析していることを指定しているため、エラーは発生しません。


ただし、IIRC はInt32.Parseデフォルトで入力を整数として解釈する必要があるため、そのサンプル コードでエラーが発生する理由はわかりません。


アップデート:

最近追加した情報から、問題が外部にあるものではないことを確認する必要があるようです。これは、たとえば、ユーザーが Windows ロケールの正符号設定を変更した場合、8正常であり、取得しているエラーを取得するのに完全に理にかなっています。を正符号として設定し、+それを解析しようとするのと同じです。

var ci = new CultureInfo("sv-SE");
var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo));

nfi.PositiveSign = "+";

Int32.Parse("+", nfi); // This will throw

Connect の問題で示されているようなロケール レジストリ設定についてユーザーに尋ね、それらが期待どおりであることを確認します。

サイドノート:SOへようこそ。次回、質問にさらに情報を追加する必要がある場合は、回答で提供するのではなく、編集する必要があります。

于 2010-04-27T09:29:42.760 に答える