文字列を解析するコードがいくつかあり、文字列が空の場合、例外がスローされます。解析コードを変更せずに、プログラムが空の文字列をゼロに変換するようにしたいと思います。それ、どうやったら出来るの?
UPD:数行のコードがある場合、入力文字列を でチェックする必要があることはわかっていますが、String.IsNullOrEmpty
ほぼ 100行あるので、拡張メソッドなどを作成するなど、別の方法でこれを解決したいと考えています。Convert.ToInt32
Convert.ToInt16
文字列を解析するコードがいくつかあり、文字列が空の場合、例外がスローされます。解析コードを変更せずに、プログラムが空の文字列をゼロに変換するようにしたいと思います。それ、どうやったら出来るの?
UPD:数行のコードがある場合、入力文字列を でチェックする必要があることはわかっていますが、String.IsNullOrEmpty
ほぼ 100行あるので、拡張メソッドなどを作成するなど、別の方法でこれを解決したいと考えています。Convert.ToInt32
Convert.ToInt16
私は次のようなことをします:
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
私が考えることができる最高のものは
int number = System.Convert.ToInt32("".EmptyToNumber());
ここで、EmptyToNumber は文字列の拡張メソッドです
public static string EmptyToNumber(this string input)
{
return (string.IsNullOrEmpty(input) ? "0" : input);
}
ただし、これにはコード内のすべての Convert.ToInt32 を検索し、パラメーターとして渡された既存の文字列に拡張子 EmptyToNumber を追加する必要があります。
これは、渡された値(または をスローするこの観察された動作を持つ他の変換メソッド) を変更せずに行うことはできません。Convert.ToInt32
FormatException
問題を引き起こしているのが空の文字列だけである場合は、三項条件演算子が便利です。
int num = !string.IsNullOrEmpty(input)
? Convert.ToInt32(input)
: 0;
(Convert.ToInt32(null)
実際には問題なく 0 に評価されますが、そのケースを自分で処理することも同様に有効です..)
もちろん、これは、などの入力値では壊れ"foo"
ます..
ここでの適切な行動方針は、フレームワークが変更されることを期待するのではなく、別の手法を適用することだと思います. 文字列のインスタンスの拡張メソッドを作成する次のコードを使用してみてください。
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;
}
}
RegExに精通している場合は、次のようなことができます
public static bool IsNumeric(string text)
{
return string.IsNullOrEmpty(text) ? false :
Regex.IsMatch(text, @"^\s*\-?\d+(\.\d+)?\s*$");
}
String x = "";
int val =0;
if(x != String.Empty){
if(Integer.TryParse(x)){
val = Convert.ToInt32(x)
}else{
///Exception
}
}
Use val variable here
ChaosPandion の回答 (彼のコードに基づく) のおかげで、高速なチェックと変換を行う方法がわかりました。また、コードの変更を削除するだけに減らすのにも役立ちConvert.
ます。
int のメソッドは次のとおりです。
public static Int32 StringToInt32(string str)
{
if (string.IsNullOrEmpty(str))
return 0;
else
return Convert.ToInt32(str);
}
文字列が空のときに例外がスローされると言いますか?したがって、例外をキャッチします。
int myvar = 0;
try {
myvar = myParseMethod(input); // call your parse method here
}
catch (MyEmptyStringException ex) {
// Keep going
}