如何在Java中检查字符串值是否为布尔类型?

53

我在这方面做了一些搜索,但没有找到任何有用的信息。

关键是,如果字符串值为"true"或"false",则返回值应该为true。在其他所有值中,它应该为false。

我尝试了以下方法:

String value = "false";
System.out.println("test1: " + Boolean.parseBoolean(value));
System.out.println("test2: " + Boolean.valueOf(value));
System.out.println("test3: " + Boolean.getBoolean(value));

所有函数都返回了false :(


23
即使您将 value 设为 "true" - moxn
1
无论如何,如果您尝试其中一种提出的方法,为了安全起见,应使用String.equalsIgnoreCase(String s)。 - moxn
1
你试过这个吗:http://tinyurl.com/ycovuqg - Alexander Pogrebnyak
1
似乎您正在错误地使用这些方法。请查看Java文档中的布尔值部分。http://www.j2ee.me/javase/6/docs/api/java/lang/Boolean.html - Dan Polites
2
Ragnar,你找不到它的原因是每个人对于布尔类型在字符串形式下应该是什么有不同的定义。"TRUE" 有效吗?"True" 呢?双字节字符中的 "TRUE" 呢?对于 Perl 程序员来说,使 "1" 不成立是无法接受的。:) 因此,你的方法必须明确表达它所需的内容。 - Alex Feinman
显示剩余2条评论
16个回答

64
  • parseBoolean(String) 方法如果传入的字符串是(不区分大小写)“true”,则返回 true,否则返回 false。
  • valueOf(String) 方法同样也是如此,返回规范化的 Boolean 对象。
  • getBoolean(String) 方法是一个红鲱鱼;它获取给定名称的系统属性并将其与“true”进行比较。

不存在测试字符串是否编码为布尔值的方法;实际上,任何非“true”字符串都可以视作“false”。


3
好的,我会尽力进行翻译。以下是需要翻译的内容:好的,这就是我需要知道的。我想知道为什么将任何非“真”字符串视为假是实用的?在我看来,有效的输入应该是真和假,其他任何东西都不是布尔类型的输入。回答:在编程语言中,通常将非空字符串解释为True(真),将空字符串解释为False(假)。这种设计的目的是为了方便程序员使用字符串类型的变量作为条件表达式,以及与其他数据类型进行比较。因此,任何非空字符串都被视为True(真),包括那些实际上不是布尔类型的输入。希望能解答您的疑问。 - Ragnar
6
可以想象一种“BooleanFormatException”异常,类似于在尝试解析非数字字符串时发生的NumberFormatException异常。我想这在编写该库时被认为是不必要的(1996年!),因为目标环境是嵌入式系统,如机顶盒和浏览器。 - mfx
14
没有 BooleanFormatException 这个异常,但如果使用 Apache Commons 的 BooleanUtils.toBooleanObject 方法解析字符串时出现问题,它会返回 null 值,这对于处理数据很有帮助。 - Peymankh
不存在一种方法来测试一个字符串是否编码为布尔值;在所有实际效果中,任何非“true”字符串都是“false”。这显然是错误的! - fritz

48
return "true".equals(value) || "false".equals(value);

36
不要硬编码 "true""false",可以使用 true.toStringfalse.toString,以防字符串表示形式的 "true" 和 "false" 未来发生更改 ;) - Ben James
2
在其他编程语言中,“1”和“0”也被视为布尔字符串解析的有效值,因此我不太喜欢“硬编码真和假”的方法。另一方面,OP引入了对真和假的限制,所以嗯... - Thorsten Dittmar
1
我本来希望避免这种情况,因为输入值也可能是“true”、“True”或“TRUE”等。 - Ragnar
3
正如我在上面的评论中指出的,你应该使用String.equalsIgnoreCase(String s)。 - moxn
@moxn 谢谢。我可能会将其包装成一个函数来检查真和假,这样我就可以得到更干净的代码。 - Ragnar

24

Apache commons-lang3中有一个BooleanUtils类,其中包含一个名为toBooleanObject的方法:

BooleanUtils.toBooleanObject(String str)

// where: 

BooleanUtils.toBooleanObject(null)    = null
BooleanUtils.toBooleanObject("true")  = Boolean.TRUE
BooleanUtils.toBooleanObject("false") = Boolean.FALSE
BooleanUtils.toBooleanObject("on")    = Boolean.TRUE
BooleanUtils.toBooleanObject("ON")    = Boolean.TRUE
BooleanUtils.toBooleanObject("off")   = Boolean.FALSE
BooleanUtils.toBooleanObject("oFf")   = Boolean.FALSE
BooleanUtils.toBooleanObject("blue")  = null

1
还有一个 toBoolean 方法,它会在这个方法返回 null 的时候返回 false。这似乎更加安全,但是这让你可以检查对象是否存在。 - Noumenon

6
if ("true".equals(value) || "false".equals(value)) {
  // do something
} else {
  // do something else
}

5

也可以通过正则表达式完成:

Pattern queryLangPattern = Pattern.compile("true|false", Pattern.CASE_INSENSITIVE);
Matcher matcher = queryLangPattern.matcher(booleanParam);
return matcher.matches();

5

以下是一种方法,可以用它来检查一个值是否为布尔值:

boolean isBoolean(String value) {
    return value != null && Arrays.stream(new String[]{"true", "false", "1", "0"})
            .anyMatch(b -> b.equalsIgnoreCase(value));
}

使用IT技术的例子:

System.out.println(isBoolean(null)); //false
System.out.println(isBoolean("")); //false
System.out.println(isBoolean("true")); //true
System.out.println(isBoolean("fALsE")); //true
System.out.println(isBoolean("asdf")); //false
System.out.println(isBoolean("01truefalse")); //false

yes/no, y/n ... - Lluis Martinez
如果您自己将字符串转换,那么这将起作用。但是纯Oracle方法Boolean.parseBoolean()和Boolean.valueOf()将对“0”和任何不是“true”和“TRUE”的内容返回false。 - Maia

4
你调用Boolean类的方法并不会检查字符串是否包含有效的布尔值,但它们返回表示字符串内容的布尔值:将"true"放入字符串中,它们返回true,将"false"放入字符串中,它们返回false。你当然可以使用这些方法来检查有效的布尔值,因为如果字符串包含"hello"或其他非布尔值,我希望它们会抛出异常。
将其包装在一个名为ContainsBoolString的方法中,你就可以了。
另外,C#中有像bool Int32.TryParse(string x, out int i)这样的方法,它执行检查是否可以解析内容,然后返回解析结果。
int i;
if (Int32.TryParse("Hello", out i))
  // Hello is an int and its value is in i
else
  // Hello is not an int

基准测试表明,它们比以下内容要快得多:

int i;
try
{
   i = Int32.Parse("Hello");
   // Hello is an int and its value is in i
}
catch
{
   // Hello is not an int
}

也许在Java中有类似的方法?我已经有一段时间没有使用Java了...

别用C#的代码逗弄Java开发人员。 话虽如此,在Java 8中,使用Optional可能会很有用,可以编写一个小包装器,其中Optional.empty表示非布尔值。 - Stachu
如果你仔细阅读我的回答,你会发现我并没有用C#代码来戏弄他,而是建议他在Java中寻找类似于C#中的方法,因为它们方便地同时进行验证和转换。正如我所说,我已经有一段时间没有使用Java了,所以我不确定是否引入了这样的功能。 - Thorsten Dittmar
这只是一个玩笑,“逗你玩的”。 - Stachu
抱歉,我没听懂 ;-) - Thorsten Dittmar

4
实际上,检查字符串中的布尔类型是不可能的。基本上你想知道怎么进行“字符串比较”。
像其他人所说的。您需要定义何时返回“true”或“false”(在什么条件下)。你想让它区分大小写吗?如果值为null怎么办?
我认为Boolean.valueOf()是你的朋友,javadoc说:
返回一个由指定字符串表示的布尔值。如果字符串参数不为空且等于字符串"true"(忽略大小写),则返回代表true的布尔值。
例如:Boolean.valueOf("True")返回true。 例如:Boolean.valueOf("yes")返回false。

不错的研究。唯一的问题是,它也不能与Boolean.valueOf()一起使用。 - VVB
你能具体说明一下你正在尝试什么以及哪些方面出现了问题吗? - Stefan Hendriks

2

是的,但是,你没有解析“false”吗?如果你解析“true”,那么它们会返回true。

也许有一个误解:这些方法不是测试字符串内容是否表示布尔值,而是将字符串内容评估为布尔值。


我也有点想通了。 - Ragnar

1

你还需要考虑的一点是字符大小写问题...

不要:

return value.equals("false") || value.equals("true");

做这个:
return value.equalsIgnoreCase("false") || value.equalsIgnoreCase("true");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接