0

文字列を解析するコードがいくつかあり、文字列が空の場合、例外がスローされます。解析コードを変更せずに、プログラムが空の文字列をゼロに変換するようにしたいと思います。それ、どうやったら出来るの?

UPD:数行のコードがある場合、入力文字列を でチェックする必要があることはわかっていますが、String.IsNullOrEmptyほぼ 100行あるので、拡張メソッドなどを作成するなど、別の方法でこれを解決したいと考えています。Convert.ToInt32Convert.ToInt16

4

8 に答える 8

3

私は次のようなことをします:

Convert.ToInt32(String.IsNullOrEmpty(myStr) ? "0" : myStr)

別のアイデアは使用することです:

int res;
Int32.TryParse("", out res);

TryParse失敗してfalseを返しますが、パラメータを初期化する必要がresあるため、結果として0に設定されます。out

の「ほぼ100」のインスタンスの変更を回避するためのオプションは実際には多くありませんConvert.Int32スティーブの拡張メソッド手法を使用するのはかなり簡単ですが、すべての呼び出しを実行.EmptyToNumber()し、最後にを追加する必要があります。

Visual Studioでグローバルな検索と置換を実行し、静的クラスをラッパーとして置換Convert.ToInt32(して実装することもできます。それはかなり安全なはずです。SafeConvert.ToInt32(SafeConvert

于 2012-08-22T21:44:30.243 に答える
2

私が考えることができる最高のものは

int number = System.Convert.ToInt32("".EmptyToNumber());

ここで、EmptyToNumber は文字列の拡張メソッドです

public static string EmptyToNumber(this string input)
{
    return (string.IsNullOrEmpty(input) ? "0" : input); 
}

ただし、これにはコード内のすべての Convert.ToInt32 を検索し、パラメーターとして渡された既存の文字列に拡張子 EmptyToNumber を追加する必要があります。

于 2012-08-22T21:47:21.730 に答える
2

これは、渡された値(または をスローするこの観察された動作を持つ他の変換メソッド) を変更せずに行うことはできません。Convert.ToInt32FormatException

問題を引き起こしているのが空の文字列だけである場合は、三項条件演算子が便利です。

int num = !string.IsNullOrEmpty(input)
    ? Convert.ToInt32(input)
    : 0;

(Convert.ToInt32(null)実際には問題なく 0 に評価されますが、そのケースを自分で処理することも同様に有効です..)

もちろん、これは、などの入力値では壊れ"foo"ます..

于 2012-08-22T21:42:45.493 に答える
1

ここでの適切な行動方針は、フレームワークが変更されることを期待するのではなく、別の手法を適用することだと思います. 文字列のインスタンスの拡張メソッドを作成する次のコードを使用してみてください。

public static class ConversionExtensions
{
    public static int? ToInt32(this string input)
    {
        int value;
        if (!int.TryParse(input, out value) && !string.IsNullOrEmpty(input))
        {
            // this is some weird input that 
            // I may need to handle
            return null;
        }
        return value;
    }
}
于 2012-08-22T21:47:22.273 に答える
0

RegExに精通している場合は、次のようなことができます

public static bool IsNumeric(string text)
{
    return string.IsNullOrEmpty(text) ? false :
            Regex.IsMatch(text, @"^\s*\-?\d+(\.\d+)?\s*$");
}
于 2012-08-22T21:49:09.357 に答える
0
  String x = "";
    int val =0;

    if(x != String.Empty){

      if(Integer.TryParse(x)){
         val = Convert.ToInt32(x)
       }else{
         ///Exception
      }
    }

     Use val variable here 
于 2012-08-22T21:39:46.527 に答える
0

ChaosPandion の回答 (彼のコードに基づく) のおかげで、高速なチェックと変換を行う方法がわかりました。また、コードの変更を削除するだけに減らすのにも役立ちConvert.ます。

int のメソッドは次のとおりです。

public static Int32 StringToInt32(string str)
{
    if (string.IsNullOrEmpty(str))
        return 0;
    else
        return Convert.ToInt32(str);
}
于 2012-08-22T22:02:46.343 に答える
-1

文字列が空のときに例外がスローされると言いますか?したがって、例外をキャッチします。

int myvar = 0;
try {
  myvar = myParseMethod(input); // call your parse method here
}
catch (MyEmptyStringException ex) {
  // Keep going
}
于 2012-08-22T22:13:10.293 に答える