26

我正在尝试将值"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.StringBoolean

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

9 回答 9

68

发生这种情况是因为Convert.ToBoolean预计会出现以下情况之一:

任何其他值都对 无效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;
    }
}

尽管这不是一个干净漂亮的方法,但它保证了获得正确值的更多可能性。而且,该Extensions课程远离您的数据/业务代码。

最后,您的转换代码使用起来相对简单:

String myString = "1";
Boolean myBoolean = myString.ToBoolean();
于 2013-04-25T02:33:47.780 回答
7
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");
}
于 2013-04-25T02:34:52.850 回答
3

既然仍然进行这些转换等等,那么扩展方法怎么样?

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

所以你会像这样使用它:

"0".ToBool();

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

于 2013-04-25T02:37:05.657 回答
1

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

来自MSDN

因为如果值不为零,则Convert.ToBoolean期望为真;否则为假。数值和TrueFalse String值。

于 2013-04-25T02:37:05.937 回答
1

如果您知道它将是一个 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);
}
于 2013-04-25T02:40:36.700 回答
1

足够快和简单:

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; }
        }
}
于 2017-06-21T10:01:13.003 回答
0

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

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;
    }
}
于 2015-11-03T18:14:56.480 回答
0
    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
于 2019-03-18T10:37:27.433 回答
0

为时已晚,但如果其他人也在寻找同样的东西,可以试试这个,它简短而容易

return (string!= "0")

于 2021-07-18T10:14:33.110 回答