2009-11-05 5 views
9

以下のコードでFormatExceptionを投げないようにするにはどうすればよいですか?私は、intに先行するゼロを持つ文字列を解析できるようにしたいと思います。これを行うためのきれいな方法がありますか?int.Parse()に先行ゼロがある

string value = "01"; 
int i = int.Parse(value); 
+1

(私は解析する解析変更した場合)あなたのサンプルコードは、私のために細かい動作します。 –

+0

多分 'int.Parse(value、Culture.InvariantCulture)'を使用してください – Sebastian

+0

多くの場合、先行するゼロは数値が8進数(基数8)であることを意味します。文字列 '" 020 "は' 20 '(基数10)または' 16 '(基数10)を意味しますか? – Dai

答えて

18

コードがFormatException(あなたが適切法を活用たら)せずに、私のために動作します:

string value = "01"; 
int i = int.Parse(value); 

しかし、これは古い鐘を鳴らすん。私は何年も前に問題を抱えていました.Windowsのローカライゼーションコンポーネント(.NETではなく)に対するバグとしてMicrosoftが受け入れました。あなたがこれを見ているかどうかをテストするには、このコードを実行すると、私たちはあなたがFormatException得るかどうかを知っている:

string value = "0"; // just a zero 
int i = int.Parse(value); 

EDIT:こちらの症状はあなたと一致した場合、バック2007年から参照してください、ユーズネットからの私の投稿です。

参考までに、ここではわかりました。 影響を受けたコンピュータで、 のレジストリ値 [HKEY_CURRENT_USER \ Control Panel \ International \ sPositiveSign]の不正なデータがありました。 通常、この値は空の REG_SZ(NULLで終了する文字列)です。 この場合、文字列には ターミネータがありませんでした。これにより、 関数GetLocaleInfoW()が混乱し、 には、現在の ロケールの正符号である '0'(ASCII番号ゼロ)と考えられます(通常は '+'にする必要があります)。 これはあらゆる種類の混乱を引き起こしました。

あなたは regedit.exeをして自分のためにこれを確認することができます値と 選択「を変更バイナリデータ」に 右クリックして、そのREG値を開きます。 には、右に2つのドットが表示されます。ヌルターミネーターを表す ドットが表示されない場合は、影響を受けます。 ターミネータ(0~0個)を追加して修正します。

の値を確認することもできます。CultureInfo.CurrentCulture.NumberFormat.PositiveSign; 「+」にする必要があります。

Windowsローカライズ APIのバグです。クラスライブラリではありません。 reg ターミネータ の値を確認する必要があります。彼らはそれを見ている。

...と問題についてhere's a report on Microsoft Connect

+0

合意 - それは私にとってもうまくいく –

1

INT iは= Convert.ToInt32(値)をしてみてください。

:Hmm。指摘したように、Int32.Parseをラッピングするだけです。それに関係なく、FormatExceptionをなぜ受け取っているのか分かりません。

+1

Convert.ToInt32はint.parseと何が違うのですか? –

+1

Convert.ToInt16とConvert.ToInt64は、実際はint.Parseメソッドの静的ラッパーメソッドです。周囲のコードが同等であれば、それはint.Parseよりも遅くなる可能性があります。 – Nescio

+0

@Taylor:.Net Reflectorで確認できます –

4

TryParseあなたは例外がスローされることなく、解析の結果を確認することができます。MSDN

を引用することは、その32ビット符号付き整数 相当する数の文字列表現に変換します。戻り値は、操作が成功したかどうかを示す を示します。

あなたはまったく何もする必要はありません

private static void TryToParse(string value) 
    { 
     int number; 
     bool result = Int32.TryParse(value, out number); 
     if (result) 
     { 
     Console.WriteLine("Converted '{0}' to {1}.", value, number);   
     } 
     else 
     { 
     if (value == null) value = ""; 
     Console.WriteLine("Attempted conversion of '{0}' failed.", value); 
     } 

}

4
int i = int.parse(value.TrimStart('0')); 
+0

私はローカル/ベースの問題を回避するこのアプローチが好きです。しかし、私は、値はちょうど0文字の場合、答えを編集すると思います! – jmnben

1

彼らの例を使用するには。先頭のゼロを追加しても、FormatExceptionは発生しません。

あなたのコードを試してみましたが、parseParseに修正した後、それはうまく動作し、例外をスローしません。

明らかに、使用している実際のコードが表示されていないため、問題のある場所については言えませんが、先行ゼロを処理するには問題ありません。

7

私は役立つかもしれない以下のコード持って

int i = Int32.Parse(value, NumberStyles.Any); 
1

を試してみてください。これは、すべての余分なリード0を切り落とすと、唯一の0

0

のケースを避けることができます

int i = int.Parse(value.Trim().Length > 1 ? 
    value.TrimStart(new char[] {'0'}) : value.Trim()); 

を10進数の場合:

Convert.ToInt32("01", 10); 
// 1 
先行ゼロは共通している16ビットの数値については、

Convert.ToInt32("00000000ff", 16); 
// 255