【问题标题】:Convert.ToBoolean fails with "0" valueConvert.ToBoolean 失败,值为“0”
【发布时间】:2013-04-18 19:08:51
【问题描述】:

我正在尝试将值 "0" ( System.String ) 转换为其 Boolean 表示形式,例如:

var myValue = Convert.ToBoolean("0"); // throwing an exception here

我查看了MSDN page,在代码示例块中,我发现了以下几行:

ConvertToBoolean("0");
// ...
Unable to convert '0' to a Boolean.

在我的代码中,我正在从 System.String 转换为 Boolean,如下所示:

// will be OK, but ugly code
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
  • 有没有其他方法可以转换成Boolean 类型而不用那么难看的代码?
  • 为什么会出现这样的异常?因为从引用类型System.String转换为值类型System.Boolean,但是System.Int32也是值类型不是吗?

【问题讨论】:

  • 您引用的示例表明存在 ToBoolean() 方法将拒绝的无效字符串。除了“0”之外,它们还显示了“TrueString”和 string.Empty 的示例。该示例显示这些是无效的,而不是您可以实际使用这些值。
  • 为什么不使用 var res="1yestrue".Contains(yourVar)?还有 Boolean.Parse() / Boolean.TryParse() ?
  • 只需使用 Convert.ToInt32("0") > 0 即可获得 bool 。

标签: c# types reference value-type type-conversion


【解决方案1】:

发生这种情况是因为Convert.ToBoolean 期待以下情况之一:

  • "True" (String) = true
  • "False" (String) = false
  • 0(数值类型;int、double、float 等)=false
  • 任何非0(数字类型;...)=true
  • null = false

任何其他值对于Boolean都是无效的。

已经有了干净的方法:

var myValue = Convert.ToBoolean(Convert.ToInt32("0"));

编辑:您可以创建一个扩展方法来为您处理其中一些情况,同时隐藏处理转换的丑陋。

此扩展对Boolean 提供了非常松散的解释:

  • "True"(字符串)=true
  • "False"(字符串)=false
  • "0"(字符串)=false
  • 任何其他字符串 = true

代码:

public static class Extensions
{
    public static Boolean ToBoolean(this string str)
    {
        String cleanValue = (str ?? "").Trim();
        if (String.Equals(cleanValue, "False", StringComparison.OrdinalIgnoreCase))
            return false;
        return
            (String.Equals(cleanValue, "True", StringComparison.OrdinalIgnoreCase)) ||
            (cleanValue != "0");
    }
}

或者,如果您想要更严格的方法,它遵循 .NET Framework 的预期;然后只需使用try/catch 语句:

public static class Extensions
{
    public static Boolean ToBoolean(this string str)
    {
        try
        {
            return Convert.ToBoolean(str);
        }
        catch { }
        try
        {
            return Convert.ToBoolean(Convert.ToInt32(str));
        }
        catch { }
        return false;
    }
}

虽然不是 cleanpretty 方法,但它保证了获得正确值的更多可能性。而且,Extensions 类隐藏在您的数据/业务代码之外。

最后,你的转换代码使用起来还是比较简单的:

String myString = "1";
Boolean myBoolean = myString.ToBoolean();

【讨论】:

  • 尝试将“0”转换为布尔类型,正如我在主题中所说的,并查看 msdn 示例:msdn.microsoft.com/en-us/library/86hw82a3.aspx,尝试转换“0”时会出现异常" 字符串值。
  • 因为"0" 不是 "True""False"only 接受的字符串表示形式是"True""False"
  • 你已经刷新了你的回答:) 它的第一个变体是不同的,并且在列表中保留了“0”,所以我的评论被引用了,而不是刷新的:) 也是最干净的方法代码风格看起来很丑
  • 您可以根据需要使用扩展方法来获得 Parse Boolean。它将使您的代码干净直接地从字符串转换为布尔值。
  • @Jesse 也感谢您的出色回答;)我认为,这样的问题对学生来说将是一个很好的练习,或者是求职面试的一个很好的测试。只是为了在测试中对此类问题提出一个 Q 并询问解决方案或可能的例外情况。
【解决方案2】:
public static class BooleanParser
{
    public static bool SafeParse(string value)
    {
        var s = (value ?? "").Trim().ToLower();
        return s == "true" || s == "1";
    }
}

static readonly HashSet<string> _booleanTrueStrings = new HashSet<string> { "true", "yes", "1" };
static readonly HashSet<string> _booleanFalseStrings = new HashSet<string> { "false", "no", "0" };

public static bool ToBoolean(string value)
{
    var v = value?.ToLower()?.Trim() ?? "";
    if (_booleanTrueStrings.Contains(v)) return true;
    if (_booleanFalseStrings.Contains(v)) return false;
    throw new ArgumentException("Unexpected Boolean Format");
}

【讨论】:

    【解决方案3】:

    既然还是做这些转换之类的事情,那么扩展方法怎么样?

    public static class Extensions {
        public static bool ToBool(this string s) {
            return s == "0" ? false : true;
        }
    }
    

    然后你会像这样使用它:

    "0".ToBool();
    

    如果您愿意,现在您可以轻松扩展此方法以处理更多情况。

    【讨论】:

      【解决方案4】:

      要成功进行转换,value 参数必须等于Boolean.TrueString(值为True 的常量)、Boolean.FalseString(值为False 的常量),或者它必须为空。在将值与 Boolean.TrueString 和 Boolean.FalseString 进行比较时,该方法会忽略大小写以及前导和尾随空格。

      来自MSDN

      因为Convert.ToBoolean 需要一个true if value is not zero; otherwise, false. 数值和TrueFalse String 值。

      【讨论】:

        【解决方案5】:

        如果您知道它将是一个 int,那么您可以将其转换为 int,然后再转换为 bool。以下将通过尝试字符串然后尝试数字来尝试转换为布尔值。

        public bool ToBoolean(string value)
        {
          var boolValue = false;
          if (bool.TryParse(value, out boolValue ))
          {
            return boolValue;
          }
        
          var number = 0;
          int.TryParse(value, out number))
          return Convert.ToBoolean(number);
        }
        

        【讨论】:

          【解决方案6】:

          足够快且简单:

          public static class Extensions
          {
                  static private List<string> trueSet = new List<string> { "true","1","yes","y" };
          
                  public static Boolean ToBoolean(this string str)
                  {
                      try
                      { return trueSet.Contains(str.ToLower()); }
                      catch { return false; }
                  }
          }
          

          【讨论】:

            【解决方案7】:

            这是一个非常宽容的解析器,它关闭了第一个字符:

            public static class StringHelpers
            {
                /// <summary>
                /// Convert string to boolean, in a forgiving way.
                /// </summary>
                /// <param name="stringVal">String that should either be "True", "False", "Yes", "No", "T", "F", "Y", "N", "1", "0"</param>
                /// <returns>If the trimmed string is any of the legal values that can be construed as "true", it returns true; False otherwise;</returns>
                public static bool ToBoolFuzzy(this string stringVal)
                {
                    string normalizedString = (stringVal?.Trim() ?? "false").ToLowerInvariant();
                    bool result = (normalizedString.StartsWith("y") 
                        || normalizedString.StartsWith("t")
                        || normalizedString.StartsWith("1"));
                    return result;
                }
            }
            

            【讨论】:

              【解决方案8】:
                  public static bool GetBoolValue(string featureKeyValue)
                  {
                      if (!string.IsNullOrEmpty(featureKeyValue))
                      {
                                  try 
                                  {
                                      bool value;
                                      if (bool.TryParse(featureKeyValue, out value))
                                      {
                                          return value;
                                      }
                                      else
                                      {
                                          return Convert.ToBoolean(Convert.ToInt32(featureKeyValue));
                                      }
                                  }
                                  catch
                                  {
                                      return false;
                                  }
                       }
                       else
                       {
                                return false;
                       }
                 }
              

              你可以这样称呼它-:

              GetBoolValue("TRUE") // true
              GetBoolValue("1") // true
              GetBoolValue("") // false
              GetBoolValue(null) // false
              GetBoolValue("randomString") // false
              

              【讨论】:

                【解决方案9】:

                为时已晚,但如果其他人也在寻找同样的东西,可以试试这个简单而简单的方法

                return (string!= "0")

                【讨论】:

                  猜你喜欢
                  • 2013-07-23
                  • 1970-01-01
                  • 2017-11-10
                  • 2019-10-22
                  • 2022-10-16
                  • 2020-12-01
                  • 1970-01-01
                  • 2014-01-16
                  • 2021-07-16
                  相关资源
                  最近更新 更多