0

我有一些解析字符串的代码,当字符串为空时,会引发异常。我想让程序仍然将空字符串转换为零而不修改解析代码。我怎么做?

UPD:我知道如果我有几行代码,我应该用 来检查输入字符串String.IsNullOrEmpty,但我有将近一百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

您确实没有太多选择可以避免更改“近百个” Convert.Int32. 使用Steve 的扩展方法技术是相当简单的,但是您必须遍历每个调用并.EmptyToNumber()在末尾添加。

您还可以在 Visual Studio 中执行全局查找和替换Convert.ToInt32(并替换为SafeConvert.ToInt32(,然后将静态类实现SafeConvert为包装器。这应该是相当安全的。

于 2012-08-22T21:44:30.243 回答
2

如果不更改传入的值Convert.ToInt32(或具有观察到的抛出 a 行为的其他转换方法),则无法完成此操作FormatException

如果只是导致问题的空字符串,那么三元条件运算符会很方便:

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

Convert.ToInt32(null)实际上将评估为 0 就好了,但我们自己处理这种情况同样有效..)

当然,对于"foo"诸如此类的输入值,这仍然会中断..

于 2012-08-22T21:42:45.493 回答
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 回答
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
  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

如果您熟悉 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

感谢 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 回答