我有一些解析字符串的代码,当字符串为空时,抛出异常。我想让程序仍然将空字符串转换为零而不修改解析代码。我该怎么做?
UPD:我知道如果我有几行代码,我应该使用String.IsNullOrEmpty
检查输入字符串,但我有近一百Convert.ToInt32
和{ {1}}行,所以我真的想用其他方式解决这个问题,比如写一个扩展方法或其他东西。
答案 0 :(得分:3)
我会做类似的事情:
Convert.ToInt32(String.IsNullOrEmpty(myStr) ? "0" : myStr)
另一个想法是使用:
int res;
Int32.TryParse("", out res);
TryParse
将失败并返回false,但res
将被设置为0,因为out
参数必须初始化。
你真的没有多少选择可以避免改变几乎一百个" Convert.Int32
的实例。使用Steve's extension method technique会非常简单,但您必须完成每次通话并在最后添加.EmptyToNumber()
。
您还可以在Visual Studio中执行全局查找和替换,并将Convert.ToInt32(
替换为SafeConvert.ToInt32(
,然后将静态类SafeConvert
实现为包装器。这应该是相当安全的。
答案 1 :(得分:2)
如果没有更改传递给Convert.ToInt32
的值(或使用此观察到的抛出FormatException
的行为的转换方法),则无法完成。
如果只是导致问题的空字符串,则三元条件运算符可以很方便:
int num = !string.IsNullOrEmpty(input)
? Convert.ToInt32(input)
: 0;
(Convert.ToInt32(null)
实际上会很好地评估为0,但是我们自己处理这种情况同样有效..)
当然,对于像"foo"
等等的输入值,这仍然会中断。
答案 2 :(得分:2)
我能想到的最好的事情是
int number = System.Convert.ToInt32("".EmptyToNumber());
其中EmptyToNumber是字符串的扩展方法
public static string EmptyToNumber(this string input)
{
return (string.IsNullOrEmpty(input) ? "0" : input);
}
但是,这需要在代码中搜索所有Convert.ToInt32,并将扩展名EmptyToNumber添加到作为参数传递的现有字符串中。
答案 3 :(得分: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;
}
}
答案 4 :(得分:0)
String x = "";
int val =0;
if(x != String.Empty){
if(Integer.TryParse(x)){
val = Convert.ToInt32(x)
}else{
///Exception
}
}
Use val variable here
答案 5 :(得分:0)
如果您熟悉RegEx,您可以执行以下操作
public static bool IsNumeric(string text)
{
return string.IsNullOrEmpty(text) ? false :
Regex.IsMatch(text, @"^\s*\-?\d+(\.\d+)?\s*$");
}
答案 6 :(得分:0)
感谢ChaosPandion的回答(基于他的代码),我想出了如何进行快速检查和转换。它还有助于将代码更改减少为仅从中删除Convert.
。
这是int的方法:
public static Int32 StringToInt32(string str)
{
if (string.IsNullOrEmpty(str))
return 0;
else
return Convert.ToInt32(str);
}
答案 7 :(得分:-1)
你说当字符串为空时会抛出异常吗?所以赶上例外。
int myvar = 0;
try {
myvar = myParseMethod(input); // call your parse method here
}
catch (MyEmptyStringException ex) {
// Keep going
}