Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使默认System.Convert(转换为数值)方法将空字符串识别为零?_C#_.net_Type Conversion - Fatal编程技术网

C# 如何使默认System.Convert(转换为数值)方法将空字符串识别为零?

C# 如何使默认System.Convert(转换为数值)方法将空字符串识别为零?,c#,.net,type-conversion,C#,.net,Type Conversion,我有一些解析字符串的代码,当字符串为空时,抛出异常。我想让程序在不修改解析代码的情况下仍然将空字符串转换为零。我该怎么做 UPD:我知道如果我有几行代码,我应该用string.IsNullOrEmpty检查输入字符串,但我有将近一百行Convert.ToInt32和Convert.ToInt16,因此,我真的想用其他方法来解决这个问题,比如写一个扩展方法或其他什么。如果不更改传递到Convert.ToInt32或其他转换方法的值,就无法完成这项工作,因为观察到了抛出FormatException

我有一些解析字符串的代码,当字符串为空时,抛出异常。我想让程序在不修改解析代码的情况下仍然将空字符串转换为零。我该怎么做

UPD:我知道如果我有几行代码,我应该用string.IsNullOrEmpty检查输入字符串,但我有将近一百行Convert.ToInt32和Convert.ToInt16,因此,我真的想用其他方法来解决这个问题,比如写一个扩展方法或其他什么。如果不更改传递到Convert.ToInt32或其他转换方法的值,就无法完成这项工作,因为观察到了抛出FormatException的行为

  String x = "";
    int val =0;

    if(x != String.Empty){

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

     Use val variable here 
如果引起问题的只是空字符串,那么三元条件运算符就很方便:

int num = !string.IsNullOrEmpty(input)
    ? Convert.ToInt32(input)
    : 0;
Convert.ToInt32null实际上会计算为0,但我们自己处理这种情况也同样有效


当然,对于像foo和whatnot这样的输入值,这仍然会中断。

我将执行以下操作:

Convert.ToInt32(String.IsNullOrEmpty(myStr) ? "0" : myStr)
另一个想法是使用:

int res;
Int32.TryParse("", out res);
TryParse将失败并返回false,但是res将设置为0,因为out参数必须初始化

要避免更改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添加到作为参数传递的现有字符串中

我认为正确的做法是应用不同的技术,而不是期望框架为您而改变。尝试使用以下代码为字符串实例创建扩展方法

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;
    }
}

如果您熟悉正则表达式,可以执行以下操作

public static bool IsNumeric(string text)
{
    return string.IsNullOrEmpty(text) ? false :
            Regex.IsMatch(text, @"^\s*\-?\d+(\.\d+)?\s*$");
}

感谢ChaosPandion根据他的代码给出的答案,我找到了如何进行快速检查和转换的方法。它还有助于将代码更改减少为仅删除转换。从他们那里

以下是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
}

你能出示密码吗。。?空字符串通常不应引发异常,除非您正在进行某种奇怪类型的转换。。你看过IsNullOrEmpty吗?让我明白。是否希望System.Convert.ToInt32返回0?如果不更改名为的方法名,则@DJKRAZE Convert.ToInt32将引发FormatException,但Convert.ToInt32null将返回0。不要问我为什么:你会得到一个错误你不能将空字符串转换为Int我会做if IsNullOrEmpty检查如果不是emtpy或null然后将字符串转换为int32如果字符串不可解析怎么办?例如输入=Something@SoneshDabhi请参阅位于底部的评论,该评论是针对此类问题而放置的;-我会说这应该是一个例外,除非这种行为确实是需要的……我不建议这样做。总是需要try-catch的繁重语法不是很容易理解。@我同意,我不想在任何地方都使用它,只是围绕主解析例程。Convert.ToInt32所做的就是检查str是否为null,返回0,否则调用Int32.Parsestr,因此,在方法中已经有了该检查之后,您可以直接调用Int32.Parsestr。