.net Convert.ToBoolean和Boolean.Parse don';不接受0和1
为什么决定在解析布尔值时,0/1是不可接受的 当解析任何整型值时,它接受要解析的数字字符串。(如果.NET能够解析字符串“一亿贰拾陆万伍仟捌佰陆拾伍”,我会感到惊讶) 是什么让布尔人与众不同?在我的经验中,它们基本上是0为假,非0为真 是否有bcl方法来解析这样的字符串,如果没有,为什么 注意:我忘记在字符串中指定“0”和“1”。奇怪的是,如果已经是一个int,它会像我预期的那样工作。也许这引起了混乱 是什么让布尔人与众不同?在我的经验中,它们基本上是0为假,非0为真 这是一个实现细节,根本不相关.net Convert.ToBoolean和Boolean.Parse don';不接受0和1,.net,boolean,.net,Boolean,为什么决定在解析布尔值时,0/1是不可接受的 当解析任何整型值时,它接受要解析的数字字符串。(如果.NET能够解析字符串“一亿贰拾陆万伍仟捌佰陆拾伍”,我会感到惊讶) 是什么让布尔人与众不同?在我的经验中,它们基本上是0为假,非0为真 是否有bcl方法来解析这样的字符串,如果没有,为什么 注意:我忘记在字符串中指定“0”和“1”。奇怪的是,如果已经是一个int,它会像我预期的那样工作。也许这引起了混乱 是什么让布尔人与众不同?在我的经验中,它们基本上是0为假,非0为真 这是一个实现细节,根本不相
true
是一个布尔值false
是一个布尔值。其他任何东西都不是
如果要分析字符串“0”的计算结果为false
,而其他任何内容的计算结果为true
,则可以使用:
!mystr.Equals("0");
您需要
Convert.ToBoolean(int-value)
不确定解析方法有什么问题:-)
无用途代码:
int falseInt = 0;
int trueInt = 1;
bool falseBool;
bool trueBool;
if (bool.TryParse(falseInt.ToString(), out falseBool))
{
if (!falseBool)
{
MessageBox.Show("TryParse: False");
}
}
if (bool.TryParse(trueInt.ToString(), out trueBool))
{
if (!trueBool)
{
MessageBox.Show("TryParse: True");
}
}
falseBool = Convert.ToBoolean(falseInt);
trueBool = Convert.ToBoolean(trueInt);
if (!falseBool)
{
MessageBox.Show("Convert: False");
}
if (trueBool)
{
MessageBox.Show("Convert: True");
}
0和(不是零)不等于“false”和“true”,它们只是C选择的表示形式。其他语言使用0表示true,使用-1表示false,或者完全使用其他模式。布尔值不是0或1,它是真或假
它是否也应该处理“是”和“否”、“关”和“开”,以及所有其他类似于布尔人的事情?你的底线在哪里?不幸的是,这种情况在.NET中经常发生。例如,我不记得是XML序列化程序还是XmlConvert,但如果True/False的大小写不正确,其中一个就会失败 您可以通过整数进行往返以获得所需的内容
string s = "2";
int i = Convert.ToInt32(s);
bool b = Convert.ToBoolean(i);
在上述情况下,任何非零的值都将计算为true
因此,我创建了一个我广泛使用的类,名为ConversionStrategy,它考虑了源类型和目标类型,并选择了最理想(和最灵活)的转换策略来进行转换。这怎么样
byte i = 1; //or 0
bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0)
下面显示的共享
FormatHelper
类使用名为StringToBoolean
的重载方法的两个变体提供了一个简单的解决方案
FormatHelper.StringToBoolean(String value)
FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault)
这两种变体都提供了不区分大小写的字符串匹配
1)从字符串到布尔值的正常转换,将空字符串或空字符串默认为false
以下示例将导致布尔值为false
:-
Boolean myBool = FormatHelper.StringToBoolean("");
Boolean myBool = FormatHelper.StringToBoolean("0");
Boolean myBool = FormatHelper.StringToBoolean("false");
Boolean myBool = FormatHelper.StringToBoolean("False");
Boolean myBool = FormatHelper.StringToBoolean("no");
Boolean myBool = FormatHelper.StringToBoolean("off");
所有其他字符串值将产生布尔值true
,例如:-
Boolean myBool = FormatHelper.StringToBoolean("1");
Boolean myBool = FormatHelper.StringToBoolean("true");
Boolean myBool = FormatHelper.StringToBoolean("True");
Boolean myBool = FormatHelper.StringToBoolean("yes");
Boolean myBool = FormatHelper.StringToBoolean("xyz blah");
注意:在下面的类中编辑BooleanStringOff
的值,以包含更多(或更少)的false/off值
2)遵循与上述1)相同的规则,但允许将默认值true
作为转换的第二个参数提供。
当字符串
值为空或null
时,使用默认值。如果缺少的字符串值需要表示true
状态,则此选项非常有用
下面的代码示例将返回true
Boolean myBool = FormatHelper.StringToBoolean("",true);
下面的代码示例将返回false
Boolean myBool = FormatHelper.StringToBoolean("false",true);
这是FormatHelper
类的代码
public class FormatHelper
{
public static Boolean StringToBoolean(String str)
{
return StringToBoolean(str, false);
}
public static Boolean StringToBoolean(String str, Boolean bDefault)
{
String[] BooleanStringOff = { "0", "off", "no" };
if (String.IsNullOrEmpty(str))
return bDefault;
else if(BooleanStringOff.Contains(str,StringComparer.InvariantCultureIgnoreCase))
return false;
Boolean result;
if (!Boolean.TryParse(str, out result))
result = true;
return result;
}
}
回答这个问题很难。也许是因为微软那些心胸狭窄的开发人员有他们自己的原因?没有对他们的不尊重。只是说,他们没有考虑它需要用于什么用途或如何使用。我想不出为什么我下面的扩展不适合任何人。我的意思是布尔值是开或关,真或假。在我看来,它基本上是二进制的。Int、Double、Char、Long、Byte等的解析方法对它们的解析方法更宽容
但是,考虑一下这个问题;您正在查看对象中是否存在值。以下情况也可能如此
string myvar = "empty"; //Or maybe = "NULL"
if (String.IsNullOrEmpty(myvar))
{
//Should this be true?
}
总之,让我们把这件事简单化。下面是我使用扩展方法为字符串创建ToBoolean()
方法的解决方案
using System.Linq;
public static bool ToBoolean(this string input)
{
//Define the false keywords
String[] bFalse = { "false", "0", "off", "no" };
//Return false for any of the false keywords or an empty/null value
if (String.IsNullOrEmpty(input) || bFalse.Contains(input.ToLower()))
return false;
//Return true for anything not false
return true;
}
谢谢这就是我想要的,一个解释。如果某些语言确实使用0表示真,使用-1表示假,我真的认为它们搞糟了,但这是一个很好的理由,不必通过解析自动假设某些开发人员可能会盲目使用。为什么,是的。是的,它应该处理“是”/“否”/ ON。为了进一步解释为什么一些语言使用0为真,而1为假,考虑它们的二进制表示:<代码> 00000000 < /代码>和<代码> 11111111 < /代码>。@ MBOW: WTH?11111111对您来说是否听起来比00000000甚至-1更假?就我个人而言,我认为这是一个正确的定义问题,谈论个人偏好有点毫无意义,但看着二进制表示法肯定没有增强我对这一点的直觉……我认为有一个约定:0=false,其他任何东西都是true(通常是1,但如果你愿意,也可以是-1)。所以我会说00000是假的,1是真的,1111111是非常真实的!;)@阿里,你能告诉我0=真用什么语言吗?。我想到的唯一一个例子是shell,程序结束时通常返回(0),但这实际上是一个错误代码(erro=0->error=false,所以ok)。理论上,接受的答案听起来不错,但是当你看到这样的东西时,真的没有什么合理化可以让这变得有意义。更快的解决方案好简洁的解决方案,我喜欢!字符串“true”和字符串“false”是字符串,而不是布尔值。然而,在把它们转换成布尔语时,似乎没有人在识别它们的意义上有问题。如果我们足够聪明认识到“真”意味着真,那么我认为我们足够聪明认识到“1”和“1”意味着t