代码之家  ›  专栏  ›  技术社区  ›  Brett Allen

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

  •  60
  • Brett Allen  · 技术社区  · 15 年前

    为什么在解析布尔值时,0/1是不可接受的?

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

    是什么让乳房变得特别?在我的经验中,它们基本上是0表示错误,而非0表示正确…

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

    注意:我忘记在字符串“0”和“1”中指定。尽管很好奇,如果已经是一个int,它会像我预期的那样工作。也许这引起了混乱。

    6 回复  |  直到 9 年前
        1
  •  64
  •   Aric TenEyck    15 年前

    0和(不是零)不等于“假”和“真”,它们只是C选择的表示。其他语言使用0表示真,使用-1表示假,或完全使用其他方案。布尔是 0或1,它是对的或错的。

    它还应该处理“是”和“否”、“关”和“开”以及所有其他类似于布尔值的东西吗?你要在哪里画线?

        2
  •  25
  •   Anon.    15 年前

    是什么让乳房变得特别?在我的经验中,它们基本上是0表示错误,而非0表示正确…

    这是一个实现细节,完全不相关。

    true 是布尔值。 false 是布尔值。其他的都不是。

    如果要分析字符串“0”的计算结果 当任何其他评估 ,您可以使用:

    !mystr.Equals("0");
    
        3
  •  17
  •   Visual Micro    10 年前

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

    FormatHelper.StringToBoolean(String value)
    FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault)
    

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

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

    以下示例将导致 boolean 价值 :。-

     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");
    

    所有其他字符串值将导致 Boolean 价值 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 在下面的类中包含更多(或更少)的值,用于“假/关”

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

    String 值为空或 null . 如果缺少的字符串值需要表示 状态。

    下面的代码示例将返回

     Boolean myBool = FormatHelper.StringToBoolean("",true);
    

    下面的代码示例将返回

     Boolean myBool = FormatHelper.StringToBoolean("false",true);
    

    这是 格式助手

    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;
        }
    }
    
        4
  •  8
  •   Josh    15 年前

    不幸的是,这在.NET中经常发生。例如,我不记得它是XML序列化程序还是XMLConvert,但是如果大小写不正确,其中一个就会失败。

    你可以通过整数往返得到你想要的。

    string s = "2";
    int i = Convert.ToInt32(s);
    bool b = Convert.ToBoolean(i);
    

    在上述情况下,任何非零的值都将为真。

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

        5
  •  3
  •   Cory Charlton    15 年前

    你想要 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");
            }
    
        6
  •  3
  •   tobias Tornqvist    12 年前

    这个怎么样?

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