Boolean.parseBoolean(“ 1”)=假…?


77

对不起,很痛苦...我有: HashMap<String, String> o

o.get('uses_votes'); // "1"

然而...

Boolean.parseBoolean(o.get('uses_votes')); // "false"

我猜这....parseBoolean不接受标准0 = false 1 = true吗?

我是在做错什么,还是必须将代码包装在:

boolean uses_votes = false;
if(o.get('uses_votes').equals("1")) {
    uses_votes = true;
}

谢谢

Answers:


89

它仅接受"true"表示布尔值的字符串值true。最好的办法是

boolean uses_votes = "1".equals(o.get("uses_votes"));

或者,如果Map实际上代表一个“实体”,我认为Javabean要好得多。或者,如果它代表配置设置,那么您可能想看看Apache Commons Configuration


2
啊,那有点垃圾!好吧,这不只是我。我会用你的建议。:)谢谢
Thomas Clayson

1
理想情况下parseBoolean,如果它将获得除true或以外的值,则将通过例外false
加布

否则可能会宽一些!但是,是的,我同意-很难找到问题所在。
Thomas Clayson

3
相反,如果@Gabe得到除或以外的东西,Boolean.parseBoolean(java.lang.String)则不抛出。每当它得到除字符串“ true”或“ TRUE”之外的其他内容时,它都会返回。grepcodeExceptiontruefalsefalse
WarFox

1
@WarFox:是的,这就是为什么我理想地说它会引发异常。如果它在输入中引发了一个无法理解的异常,那么就永远不会有任何疑问,无论它是正确解析还是默认为false
加布

27

我有一个小的实用程序函数,可以将所有可能的值转换为布尔值。

private boolean convertToBoolean(String value) {
    boolean returnValue = false;
    if ("1".equalsIgnoreCase(value) || "yes".equalsIgnoreCase(value) || 
        "true".equalsIgnoreCase(value) || "on".equalsIgnoreCase(value))
        returnValue = true;
    return returnValue;
}

9
为什么不只返回“ 1”。equalsIgnoreCase(value)|| “ yes” .equalsIgnoreCase(value)|| “ true” .equalsIgnoreCase(value)|| “ on” .equalsIgnoreCase(value);
汤姆·弗雷泽


您的on子句似乎很奇怪。如果可能的值是on和off,那么这是有道理的,但是on不是确定的true / false情况,例如yes / no或1/0。例如,如果我的可能的值处于启用状态或处于启用状态,该逻辑将不起作用。但是,我通常尝试在数据库端设置布尔值,并简单地使用POJO将数据库1和0转换为Java布尔值。
jDub9 '18

12

根据文档(重点是我的):

将字符串参数解析为布尔值。如果字符串参数不为null,并且忽略大小写,等于字符串“ true”,则返回的布尔值表示true值 。


10

如果您尝试获取C的行为(0 == false其他所有内容都可以true),则可以执行以下操作:

boolean uses_votes = Integer.parseInt(o.get("uses_votes")) != 0;

嗯,这是一个有趣的解决方法,是的,我想这就是我所期望的行为。在这种情况下,我可以保证输出为1或0,因此BalusC的代码可以完美运行,但是我会记住这一点,因为它似乎非常有用。
Thomas Clayson

4

我知道这是一个旧线程,但是从C语法中借用呢:

(o.get('uses_votes')).equals("1") ? true : false;

10
最后的? true : false位是一个众所周知的反模式:由于没有特别的原因,它只是键入了14个额外的字符,因为左侧已经是布尔值,并对其进行测试以决定是否返回true还是false很傻。
2013年

由于它的帮助我
Jatin帕特尔

3

托马斯,我认为您的包装器代码或仅条件本身,是在Java中执行您想做的事情的最干净的方法,它将“ 1”转换为布尔True值。实际上,将其与“ 0”进行比较并取反数将匹配C行为,即将0视为假,将其他所有内容视为真。

Boolean intStringToBoolean(numericBooleanValueString) {
  return !"0".equals(numericBooleanValueString);
}

2

请注意,
对于那些需要为“ true”或“ false”字符串以外的内容提供空值的用户,可以使用以下函数

public Boolean tryParseBoolean(String inputBoolean)
{    
    if(!inputBoolean.equals("true")&&!inputBoolean.equals("false")) return null;
    return Boolean.valueOf(inputBoolean);
}

2

如果出现“ y”,“ 1”,“ true”,“ on”或以类似方式添加的任何内容,则返回true

boolean getValue(String value) {
  return ("Y".equals(value.toUpperCase()) 
      || "1".equals(value.toUpperCase())
      || "TRUE".equals(value.toUpperCase())
      || "ON".equals(value.toUpperCase()) 
     );
}

0

Java是强类型的。0和1是数字,与布尔类型不同。数字永远不会等于布尔值。


2
从技术上讲,在我的实现中,它们是字符串!:p无论如何,来自php / javascript背景,我想我只是假设它可以区分0和1,打开和关闭,是和否,正确和错误。
Thomas Clayson

好吧,首先..在这种情况下,当前变量是什么并不重要,因为整个目标是从其他对象转换为布尔值。其次,假设它们是数字。例如,如果原点是查询字符串,则它实际上将作为字符串出现,与“ true”和“ false”一样多。
Rikaelus


0

这个怎么样?

boolean uses_votes =
  ( "|1|yes|on|true|"
      .indexOf("|"+o.get("uses_votes").toLowerCase()+"|")
      > -1
  );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.