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

时间:2009-12-14 21:56:08

标签: .net boolean

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

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

什么使布尔特别?它们基本上都是假的0,而在我的经验中它是非零的......

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

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

7 个答案:

答案 0 :(得分:64)

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

它是否也应该处理“是”和“否”,“关闭”和“打开”,以及所有类似布尔值的其他无数事物?你会在哪里画线?

答案 1 :(得分:27)

  

什么使布尔特别?它们基本上都是假的0,而在我的经验中它是非零的......

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

true是一个布尔值。 false是一个布尔值。其他任何事情都没有。

如果要解析某些内容,使得字符串“0”评估false而其他任何内容评估true,则可以使用:

!mystr.Equals("0");

答案 2 :(得分:17)

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

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

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

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

以下示例将导致boolean值为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");

所有其他字符串值将导致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");

注意:在下面的课程中修改BooleanStringOff的值,以包含更多(或更少)false / off值

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

String值为空或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;
    }
}

答案 3 :(得分:8)

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

你可以通过整数往返来获得你想要的东西。

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

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

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

答案 4 :(得分:3)

您希望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");
        }

答案 5 :(得分:3)

这个怎么样?

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

答案 6 :(得分:1)

要回答这个问题将很困难。也许是因为Microsoft的头脑狭窄的开发人员有他们自己的原因?没有不尊重他们的意图。只是说他们没有考虑将需要使用什么或将如何使用它。我想不出以下扩展名对任何人都无效的原因。我的意思是布尔值是打开还是关闭,是或否。在我看来,它基本上是二进制的。 Int,Double,Char,Long,Byte等的解析方法使用其Parse方法更为宽容。

但是,请考虑一下;您正在查看对象中是否存在值。对于以下内容可能会说同样的话...

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;
}