Jak przekonwertować obiekt String na obiekt boolowski?


Odpowiedzi:


516

Spróbuj (w zależności od rodzaju pożądanego wyniku):

Boolean boolean1 = Boolean.valueOf("true");
boolean boolean2 = Boolean.parseBoolean("true");

Korzyść:

  • Boolean: nie tworzy to nowych instancji Boolean, więc wydajność jest lepsza (i mniej wyrzucania elementów bezużytecznych). Ponownie wykorzystuje dwa wystąpienia jednego Boolean.TRUElub Boolean.FALSE.
  • boolean: nie jest wymagana żadna instancja, używasz typu pierwotnego.

Oficjalna dokumentacja znajduje się w Javadoc .


AKTUALIZACJA:

Można również użyć automatycznego porównywania, ale wiąże się to z obniżeniem wydajności.
Sugeruję, aby używać go tylko wtedy, gdy będziesz musiał rzucić się, a nie wtedy, gdy można tego uniknąć.


1
czy i tak nie przypisałoby Boolean.valueOf do boolaen2? Nie widzę tutaj różnicy w porównaniu z parseBoolean.
Alex Feinman,

9
Największym problemem jest to, że Boolean nie będzie wyjątek, gdy zobaczy coś, czego nie powinien zaakceptować. Zwróci prawdę dla wszystkiego, co uważa za „prawdę”, i zwróci fałsz dla wszystkiego innego . Jeśli próbujesz wymusić dopasowanie ciągu do odpowiedniej wartości logicznej, musisz dodać dodatkową logikę, aby ręcznie wychwytywać nielegalne przypadki.
Brandon Belvin,

co jeśli boolean boolean2 = Boolean.valueOf("true");
użyję

1
jeśli obiekt String ma wartość NULL, to Boolean.valueOf (String) zwróci wartość false. Ale Boolean może również przechowywać wartość NULL. czy możesz w tym pomóc.
amit kate,

90

Należy zachować ostrożność podczas korzystania z Boolean.valueOf (ciąg) lub Boolean.parseBoolean (ciąg) . Powodem tego jest to, że metody zawsze zwracają wartość false, jeśli ciąg znaków nie jest równy „true” (wielkość liter jest ignorowana).

Na przykład:

Boolean.valueOf("YES") -> false

Z powodu takiego zachowania zaleciłbym dodanie mechanizmu zapewniającego, że ciąg znaków, który powinien zostać przetłumaczony na wartość logiczną, ma określony format.

Na przykład:

if (string.equalsIgnoreCase("true") || string.equalsIgnoreCase("false")) {
    Boolean.valueOf(string)
    // do something   
} else {
    // throw some exception
}

9
To najlepszy przykład, jaki widziałem i na początek powinien był zostać zaimplementowany w typie boolowskim. Zgłoszenie wyjątku z powodu niepoprawnej wartości logicznej jest ważne dla wielu aplikacji.
Brandon Belvin,

2
Nie, to nie do końca prawda. tutaj jest podstawowa implementacja publicznego statycznego boolean parseBoolean parseBoolean (String s) {return ((s! = null) && s.equalsIgnoreCase („true”)); }
electricbah

Heh ... Jeśli musisz napisać taki kod, nie musisz wywoływać Boolean.valueOf. Zamiast tego możesz po prostu zrestrukturyzować tę instrukcję if, aby

22
Boolean b = Boolean.valueOf(string);

Wartość b true, jeśli ciąg znaków nie jest pusty i równy true(ignorując liter).


17

Oprócz doskonałej odpowiedzi KLE możemy również uczynić coś bardziej elastycznym:

boolean b = string.equalsIgnoreCase("true") || string.equalsIgnoreCase("t") || 
        string.equalsIgnoreCase("yes") || string.equalsIgnoreCase("y") || 
        string.equalsIgnoreCase("sure") || string.equalsIgnoreCase("aye") || 
        string.equalsIgnoreCase("oui") || string.equalsIgnoreCase("vrai");

(zainspirowany odpowiedzią zlajo ... :-))



9

Cóż, podobnie jak teraz w styczniu 2018 roku, najlepszym sposobem na to jest użycie apache BooleanUtils.toBoolean.

Spowoduje to konwersję dowolnego ciągu typu logicznego na boolean, np. Y, tak, prawda, N, nie, fałsz itp.

Naprawdę przydatne!


4
public static boolean stringToBool(String s) {
        s = s.toLowerCase();
        Set<String> trueSet = new HashSet<String>(Arrays.asList("1", "true", "yes"));
        Set<String> falseSet = new HashSet<String>(Arrays.asList("0", "false", "no"));

        if (trueSet.contains(s))
            return true;
        if (falseSet.contains(s))
            return false;

        throw new IllegalArgumentException(s + " is not a boolean.");
    }

Mój sposób na konwersję łańcucha znaków na wartość logiczną.


3
String[] values= new String[]{"y","Y","n","N","Yes","YES","yes","no","No","NO","true","false","True","False","TRUE","FALSE",null};
for(String booleanStr : values){
    System.out.println("Str ="+ booleanStr +": boolean =" +BooleanUtils.toBoolean(booleanStr));
}

Wynik:

Str =N: boolean =false
Str =Yes: boolean =true
Str =YES: boolean =true
Str =yes: boolean =true
Str =no: boolean =false
Str =No: boolean =false
Str =NO: boolean =false
Str =true: boolean =true
Str =false: boolean =false
Str =True: boolean =true
Str =False: boolean =false
Str =TRUE: boolean =true
Str =FALSE: boolean =false
Str =null: boolean =false

Co to jest BooleanUtils?
james.garriss

1
org.apache.commons.lang3.BooleanUtils pochodzi z Apache commons Lang API.
Dhana

plus za wysiłek zebrania wszystkich przypadków użycia.
gaurav,

1

Oto jak to zrobiłem:

"1##true".contains( string )

W moim przypadku jest to albo 1 albo prawda. Używam skrótów jako dzielników.


0

Aby uzyskać wartość boolowską ciągu, spróbuj tego:

public boolean toBoolean(String s) {
    try {
        return Boolean.parseBoolean(s); // Successfully converted String to boolean
    } catch(Exception e) {
        return null; // There was some error, so return null.
    }
}

Jeśli wystąpi błąd, zwróci wartość null. Przykład:

toBoolean("true"); // Returns true
toBoolean("tr.u;e"); // Returns null

5
Próbowałeś tego? :) parseBoolean(String s)nie zgłasza wyjątku, zgodnie z Javadoc.
zachwycił

0

Dlaczego nie użyć wyrażenia regularnego?

public static boolean toBoolean( String target )
{
    if( target == null ) return false;
    return target.matches( "(?i:^(1|true|yes|oui|vrai|y)$)" );
}

0

Stworzyliśmy bibliotekę Soyuz-To, aby uprościć ten problem (przekonwertuj X na Y). To tylko zestaw SO odpowiedzi na podobne pytania. Używanie biblioteki w przypadku tak prostego problemu może być dziwne, ale naprawdę pomaga w wielu podobnych przypadkach.

import io.thedocs.soyuz.to;

Boolean aBoolean = to.Boolean("true");

Sprawdź to - jest bardzo prosty i ma wiele innych przydatnych funkcji


-3

Odwiedzić http://msdn.microsoft.com/en-us/library/system.boolean.parse.aspx

To da ci wyobrażenie o tym, co robić.

Oto, co otrzymuję z dokumentacji Java :

Szczegół metody

parseBoolean

public static boolean parseBoolean(String s)

Analizuje argument ciągu jako wartość logiczną. Zwracana wartość logiczna reprezentuje wartość true, jeśli argument ciągu nie nulljest i jest równy, ignorując wielkość liter, ciągowi „ true”.

Parametry:

s - ciąg zawierający reprezentację logiczną, którą należy przeanalizować

Zwraca: wartość logiczna reprezentowana przez argument ciągu

Od: 1.5


1
Chociaż tekst pytania nie jest jednoznaczny, jest to pytanie dotyczące Javy. Przynajmniej jest tak oznaczony. Ta odpowiedź może mylić ludzi.
paulo.albuquerque,

-3

możesz bezpośrednio ustawić wartość logiczną równoważną dowolnemu ciągowi według klasy System i uzyskać do niego dostęp w dowolnym miejscu ..

System.setProperty("n","false");
System.setProperty("y","true");

System.setProperty("yes","true");     
System.setProperty("no","false");

System.out.println(Boolean.getBoolean("n"));   //false
System.out.println(Boolean.getBoolean("y"));   //true   
 System.out.println(Boolean.getBoolean("no"));  //false
System.out.println(Boolean.getBoolean("yes"));  //true

1
Jest to bardzo nieuczciwa propozycja konwersji ciągu znaków na wartość logiczną i po prostu nie ma sensu.
saw303
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.