我正在尝试将值"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
也是值类型,不是吗?答案 0 :(得分:56)
这种情况正在发生,因为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;
}
}
虽然不是 clean 或漂亮的方法,但它保证了获得正确值的更多可能性。并且,Extensions
类隐藏了您的数据/业务代码。
最后,您的转换代码使用起来相对简单:
String myString = "1";
Boolean myBoolean = myString.ToBoolean();
答案 1 :(得分:6)
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");
}
答案 2 :(得分:3)
因为这仍然是进行转换等问题,扩展方法怎么样?
public static class Extensions {
public static bool ToBool(this string s) {
return s == "0" ? false : true;
}
}
然后你会像这样使用它:
"0".ToBool();
现在您可以轻松扩展此方法以处理更多情况,如果您愿意。
答案 3 :(得分:1)
要成功进行转换,value参数必须等于Boolean.TrueString
,其值为True
的常量,Boolean.FalseString
,其值为False
的常量,或者它必须为null。在将值与Boolean.TrueString和Boolean.FalseString进行比较时,该方法忽略大小写以及前导和尾随空格。
来自MSDN
因为Convert.ToBoolean
需要true if value is not zero; otherwise, false.数值和True
或False
String
值。
答案 4 :(得分:1)
如果您知道它将是一个int,那么您可以将其转换为int然后转换为bool。以下将尝试通过尝试字符串然后尝试使用数字转换为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);
}
答案 5 :(得分: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; }
}
}
答案 6 :(得分: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;
}
}
答案 7 :(得分: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
答案 8 :(得分:0)
为时已晚,但如果其他人正在寻找相同的内容,可以试试这个简短而简单的方法
return (string!= "0")