我有一些解析字符串的代码,当字符串为空时,会引发异常。我想让程序仍然将空字符串转换为零而不修改解析代码。我怎么做?
UPD:我知道如果我有几行代码,我应该用 来检查输入字符串String.IsNullOrEmpty
,但我有将近一百Convert.ToInt32
行Convert.ToInt16
,所以我真的很想用其他方式解决这个问题,比如编写扩展方法之类的。
我有一些解析字符串的代码,当字符串为空时,会引发异常。我想让程序仍然将空字符串转换为零而不修改解析代码。我怎么做?
UPD:我知道如果我有几行代码,我应该用 来检查输入字符串String.IsNullOrEmpty
,但我有将近一百Convert.ToInt32
行Convert.ToInt16
,所以我真的很想用其他方式解决这个问题,比如编写扩展方法之类的。
我会做类似的事情:
Convert.ToInt32(String.IsNullOrEmpty(myStr) ? "0" : myStr)
另一个想法是使用:
int res;
Int32.TryParse("", out res);
TryParse
将失败并返回 false,但是由于必须初始化参数,因此res
将设置为 0 。out
您确实没有太多选择可以避免更改“近百个” Convert.Int32
. 使用Steve 的扩展方法技术是相当简单的,但是您必须遍历每个调用并.EmptyToNumber()
在末尾添加。
您还可以在 Visual Studio 中执行全局查找和替换Convert.ToInt32(
并替换为SafeConvert.ToInt32(
,然后将静态类实现SafeConvert
为包装器。这应该是相当安全的。
如果不更改传入的值Convert.ToInt32
(或具有观察到的抛出 a 行为的其他转换方法),则无法完成此操作FormatException
。
如果只是导致问题的空字符串,那么三元条件运算符会很方便:
int num = !string.IsNullOrEmpty(input)
? Convert.ToInt32(input)
: 0;
(Convert.ToInt32(null)
实际上将评估为 0 就好了,但我们自己处理这种情况同样有效..)
当然,对于"foo"
诸如此类的输入值,这仍然会中断..
我能想到的最好的事情是
int number = System.Convert.ToInt32("".EmptyToNumber());
其中 EmptyToNumber 是字符串的扩展方法
public static string EmptyToNumber(this string input)
{
return (string.IsNullOrEmpty(input) ? "0" : input);
}
但是,这将需要在代码中搜索所有人的 Convert.ToInt32 并将扩展名 EmptyToNumber 添加到作为参数传递的现有字符串中。
我认为这里正确的做法是应用不同的技术,而不是期望框架为你改变。尝试使用以下代码为字符串实例创建扩展方法。
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;
}
}
String x = "";
int val =0;
if(x != String.Empty){
if(Integer.TryParse(x)){
val = Convert.ToInt32(x)
}else{
///Exception
}
}
Use val variable here
如果您熟悉 RegEx,则可以执行以下操作
public static bool IsNumeric(string text)
{
return string.IsNullOrEmpty(text) ? false :
Regex.IsMatch(text, @"^\s*\-?\d+(\.\d+)?\s*$");
}
感谢 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
}