Convert.ToBoolean和Boolean.Parse不接受0和1

Bre*_*len 65 .net boolean

为什么在解析布尔值时决定不接受0/1?

解析任何整数类型值时,它接受要解析的数字字符串.(如果.NET可以解析字符串"一亿二十六万五千八百六十五"我会感到惊讶).

是什么让布尔特别?它们基本上都是假的0,而根据我的经验非零是真的......

是否有一个bcl方法来解析这样的字符串,如果没有,为什么?

注意:我忘了在字符串"0"和"1"中指定.好奇但是如果已经是一个int,它就像我预期的那样工作.也许这引起了混乱.

Ari*_*yck 66

0和(非零)不等于"假"和"真",它们只是由C选择的表示.其他语言使用0表示真,-1表示假,或完全是其他方案.布尔值不是 0或1,它是真或假.

它是否应该处理"是"和"否","关闭"和"打开",以及所有其他类似于布尔的事情?你会在哪里划线?

  • 为什么是.是的它应该处理是/否关/开. (63认同)
  • @MCattle:WTH?11111111对你来说是不是00000000,甚至是-1?我个人认为这是一个定义问题,谈论个人偏好是有点无意义的,但看二进制表示肯定没有增强我对那个人的直觉...... (5认同)
  • 为了进一步解释为什么有些语言使用0表示true而-1表示false表示,请考虑它们的二进制表示形式:`00000000`和`11111111`. (3认同)
  • 我认为有一个约定:0 =假,其他任何东西都是真的(通常是1,如果你愿意,也是-1).所以我会说00000是假的,1是真的,1111111是非常真实的!).@Aric你能用什么语言告诉我0 =真吗?我想到的唯一例子是shell,你通常在程序结束时返回(0),但这实际上是一个错误代码(erro = 0 - > error = false,所以确定). (3认同)
  • 谢谢!这就是我所寻找的,解释原因.如果某些语言确实使用0表示真,而-1表示假,我老实以为它们搞砸了,但这是一个很好的理由不通过解析自动假设某些开发人员可能盲目使用. (2认同)

Ano*_*on. 30

是什么让布尔特别?它们基本上都是假的0,而根据我的经验非零是真的......

这是一个实现细节,并没有任何相关性.

true是一个布尔值.false是一个布尔值.别的不是.

如果要解析某些内容,使得字符串"0"在评估false其他任何内容时进行评估true,则可以使用:

!mystr.Equals("0");
Run Code Online (Sandbox Code Playgroud)

  • 字符串"true"和字符串"false"是字符串,而不是布尔值.然而,在将它们转换为布尔值时,似乎没有人认识到它们的含义.如果我们足够聪明地认识到"真实"意味着真实,那么我认为我们足够聪明地认识到"1"和1意味着真实.我们足够聪明地认识到"on"和"yes"是肯定的,如果程序员特意请求转换,也可以安全地转换为true. (7认同)

Vis*_*cro 18

FormatHelper下面显示的共享类提供了一个简单的解决方案,它使用了两种称为重载方法的变体StringToBoolean.

FormatHelper.StringToBoolean(String value)
FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault)
Run Code Online (Sandbox Code Playgroud)

两种变体都提供了大小写字符串匹配

1)从字符串到布尔默认转换为空或空字符串的正常转换 false

以下示例将产生以下booleanfalse: -

 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");
Run Code Online (Sandbox Code Playgroud)

所有其他字符串值将产生如下Booleantrue: -

 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");
Run Code Online (Sandbox Code Playgroud)

注意:编辑BooleanStringOff下面类中的值以包含更多(或更少)false/off值

2)遵循与上述1)相同的规则,但允许提供默认值true作为转换的第二个参数.

String值为空或时,使用默认值null.如果缺少字符串值需要表示true状态,这将非常有用.

以下代码示例将返回 true

 Boolean myBool = FormatHelper.StringToBoolean("",true);
Run Code Online (Sandbox Code Playgroud)

以下代码示例将返回 false

 Boolean myBool = FormatHelper.StringToBoolean("false",true);
Run Code Online (Sandbox Code Playgroud)

这是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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*osh 8

不幸的是,这在.NET中发生了很多.例如,我不记得它是XML Serializer还是XmlConvert,但如果True/False的大小不正确,其中一个会失败.

你可以通过整数往返来获得你想要的.

string s = "2";
int i = Convert.ToInt32(s);
bool b = Convert.ToBoolean(i);
Run Code Online (Sandbox Code Playgroud)

在上述情况下,任何非零值都将评估为真.

出于这个原因,我创建了一个名为ConversionStrategy的类,它考虑了源类型和目标类型,并选择了最理想(和灵活)的转换策略来进行转换.

  • 接受的答案在理论上听起来不错,但是当你看到这样的东西时,真的没有合理化可以使这有意义. (2认同)

Cor*_*ton 5

你想Convert.ToBoolean(int value)不确定 Parse 方法是怎么回事:-)

无用的代码:

        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");
        }
Run Code Online (Sandbox Code Playgroud)


小智 5

这个怎么样?

  byte i = 1; //or 0
  bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0)
Run Code Online (Sandbox Code Playgroud)