Boolean.parseBoolean ("1") = false ...?

77

Es tut mir leid, ein Schmerz zu sein ... Ich habe: HashMap<String, String> o

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

Noch...

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

Ich vermute, ....parseBooleandas akzeptiert den Standard nicht 0 = false 1 = true?

Mache ich etwas falsch oder muss ich meinen Code einpacken:

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

Vielen Dank

Thomas Clayson
quelle

Antworten:

89

Es wird nur ein Zeichenfolgenwert von akzeptiert, um einen "true"Booleschen Wert darzustellen true. Das Beste, was Sie tun können, ist

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

Oder wenn das Maptatsächlich eine "Berechtigung" darstellt, denke ich, dass ein Javabeaner viel besser ist. Wenn es sich um Konfigurationseinstellungen handelt, sollten Sie einen Blick in die Apache Commons-Konfiguration werfen .

BalusC
quelle
2
ah das ist ein bisschen Quatsch! ok, es ist gut, dass es nicht nur ich war. Ich werde Ihren Vorschlag verwenden. :) Danke
Thomas Clayson
1
Idealerweise parseBooleanwürde durch eine Ausnahme, wenn es etwas anderes als trueoder bekommen würde false.
Gabe
oder es könnte etwas milder sein! Aber ja, ich stimme zu - es war schwierig, das Problem zu finden.
Thomas Clayson
3
@Gabe im Gegenteil, Boolean.parseBoolean(java.lang.String)wirft nicht, Exceptionwenn es etwas anderes als trueoder bekommt false. Es wird nur falsejedes Mal zurückgegeben, wenn etwas anderes als "true" oder "TRUE" als Zeichenfolge angezeigt wird. grepcode
WarFox
1
@ WarFox: Ja, deshalb habe ich idealerweise gesagt, es würde eine Ausnahme auslösen . Wenn es eine Ausnahme bei der Eingabe auslöste, die es nicht verstand, würde es nie eine Frage geben, ob es richtig analysiert wurde oder nur standardmäßig false.
Gabe
27

Ich habe eine kleine Utility-Funktion, um alle möglichen Werte in Boolean zu konvertieren.

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;
}
Saqib
quelle
9
Warum nicht einfach "1" zurückgeben .equalsIgnoreCase (Wert) || "yes" .equalsIgnoreCase (Wert) || "true" .equalsIgnoreCase (Wert) || "on" .equalsIgnoreCase (Wert);
Tom Fraser
Vergleichen Sie, wie Ansible es macht: docs.ansible.com/ansible/YAMLSyntax.html#truthiness
Thomas Hirsch
Ihre on-Klausel scheint seltsam. Wenn die möglichen Werte ein- und ausgeschaltet sind, ist dies sinnvoll, aber ein ist keine definitive Richtig / Falsch-Situation wie Ja / Nein oder 1/0. Was ist, wenn meine möglichen Werte zum Beispiel aktiviert sind und nicht, dann würde diese Logik nicht funktionieren. Normalerweise versuche ich jedoch, meine Booleschen Werte auf der DB-Seite festzulegen und einfach POJO zu verwenden, um Datenbank 1 und 0 in Java-Boolesche Werte zu konvertieren.
jDub9
12

Laut Dokumentation (Schwerpunkt Mine):

Analysiert das String-Argument als Booleschen Wert. Der zurückgegebene Boolesche Wert stellt den Wert true dar, wenn das Zeichenfolgenargument nicht null ist und ohne Berücksichtigung der Groß- und Kleinschreibung der Zeichenfolge "true" entspricht .

mellamokb
quelle
10

Wenn Sie versuchen, das Verhalten von C zu ermitteln ( 0 == falseund alles andere ist true), können Sie Folgendes tun:

boolean uses_votes = Integer.parseInt(o.get("uses_votes")) != 0;
Brendan Long
quelle
Ah, das ist eine interessante Arbeit, ja, ich denke, das ist das Verhalten, das ich erwartet hatte. In diesem Fall kann ich garantieren, dass die Ausgabe entweder 1 oder 0 ist, sodass der BalusC-Code einwandfrei funktioniert. Ich werde mich jedoch daran erinnern, da dies sehr nützlich erscheint.
Thomas Clayson
4

Ich weiß, dass dies ein alter Thread ist, aber was ist mit dem Ausleihen aus der C-Syntax:

(o.get('uses_votes')).equals("1") ? true : false;
AndroidDev
quelle
10
Das ? true : falseBit am Ende ist ein bekanntes Antimuster: Es sind nur 14 zusätzliche Zeichen, die ohne besonderen Grund eingegeben wurden, da die linke Seite bereits ein Boolescher Wert ist, und testen Sie sie, um zu entscheiden, ob Sie zurückkehren trueoder falsedumm sind.
Amalloy
Danke, es hilft mir
Jatin Patel
3

Thomas, ich denke, Ihr Wrapper-Code oder nur die Bedingung selbst ist der sauberste Weg, um das zu tun, was Sie in Java tun möchten. Dabei wird "1" in den Boolean True-Wert konvertiert. Tatsächlich würde ein Vergleich mit "0" und eine Umkehrung dem C-Verhalten entsprechen, 0 als falsch und alles andere als wahr zu behandeln.

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

Als Hinweis können Sie
für diejenigen, die für andere Dinge als "wahre" oder "falsche" Zeichenfolgen einen Nullwert benötigen, die folgende Funktion verwenden

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

Gibt true zurück, wenn 'y', '1', 'true', 'on'oder was auch immer Sie auf ähnliche Weise hinzufügen

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

Java ist stark typisiert. 0 und 1 sind Zahlen, ein anderer Typ als ein Boolescher Wert. Eine Zahl wird niemals gleich einem Booleschen Wert sein.

Steve Kuo
quelle
2
Technisch gesehen sind sie in meiner Implementierung Zeichenfolgen! : p Wie auch immer, ich komme aus einem PHP / Javascript-Hintergrund und habe wohl nur angenommen, dass es zwischen 0 und 1 unterscheiden kann, ein und aus, ja und nein und wahr und falsch angemessen.
Thomas Clayson
Nun, zuerst ... was eine Variable derzeit ist, spielt in diesem Zusammenhang keine Rolle, da das ganze Ziel darin besteht , von etwas anderem in einen Booleschen Wert umzuwandeln . Zweitens nehmen Sie an, dass es sich um Zahlen handelt. Wenn der Ursprung beispielsweise eine Abfragezeichenfolge ist, wird er tatsächlich genauso wie "wahr" und "falsch" als Zeichenfolge eingegeben.
Rikaelus
0

Ich hatte die gleiche Frage und habe sie damit gelöst:

Boolean use_vote = o.get('uses_votes').equals("1") ? true : false;
Théo Moulia
quelle
0

Wie wäre es damit?

boolean uses_votes =
  ( "|1|yes|on|true|"
      .indexOf("|"+o.get("uses_votes").toLowerCase()+"|")
      > -1
  );
Max Spring
quelle