为什么在解析布尔值时决定不接受0/1?
解析任何整数类型值时,它接受要解析的数字字符串。 (如果.NET可以解析字符串“一亿二百六十五万八千六百五十五”我会感到惊讶。)
什么使布尔特别?它们基本上都是假的0,而在我的经验中它是非零的......
是否有一个bcl方法来解析这样的字符串,如果没有,为什么?
注意:我忘了在字符串“0”和“1”中指定。好奇但是如果已经是一个int,它就像我预期的那样工作。也许这引起了混乱。
答案 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");
所有其他字符串值将导致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
的值,以包含更多(或更少)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;
}