2009-11-19 3 views
29

Я сделал небольшой поиск по этому вопросу, но не нашел ничего полезного.Как проверить, является ли String значением типа Boolean в Java?

Суть в том, что если значение String равно «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)); 

Все функции вернулись ложь :(

+21

Даже если вы установили 'value =" true "'? – moxn

+1

В любом случае, если вы попробуете один из предложенных подходов, вы должны использовать String.equalsIgnoreCase (String s), чтобы быть в безопасности. – moxn

+1

Вы пытались: http://tinyurl.com/ycovuqg –

ответ

44
  • parseBoolean (String) возвращает истину, если строка (без учета регистра) "истина", в противном случае ложной
  • valueOf (String) ditto, возвращает канонические логические объекты
  • getBoolean (String) является красным геррином г; он извлекает свойство System данного имени и сравнивает его с «истинным»

Не существует способа проверить, кодирует ли строка булевское; для всех практических эффектов любая не «истинная» -String «ложна».

+0

ОК, это то, что мне нужно было знать.Интересно, почему практично иметь любую неправную строчку как ложную? Я имею в виду, что допустимые входные данные должны быть истинными и ложными, а все остальное - просто не логическим вводом. – Ragnar

+4

Верно, можно представить исключение «BooleanFormatException», аналогично исключению NumberFormatException, которое возникает при попытке проанализировать строку без номера. Я полагаю, что это было сочтено ненужным в то время, когда была написана библиотека (1996!), Для целевых сред (встроенные системы, такие как телеприставки и браузеры). – mfx

+12

Ну нет BooleanFormatException, но с помощью BooleanUtils.toBooleanObject Apache Commons, если строка не может быть проанализирована, возвращается нулевое значение, что может быть весьма полезным. – Peymankh

4
if ("true".equals(value) || "false".equals(value)) { 
    // do something 
} else { 
    // do something else 
} 
25
return "true".equals(value) || "false".equals(value); 
+28

Вместо жесткого кодирования '' true '' и '' false ''вы можете использовать' true.toString' и 'false.toString', на всякий случай, если строковые представления« true »и« false », все изменения;) –

+2

В других языках «1» и «0» также считаются допустимыми для логического синтаксического разбора строк, поэтому мне не совсем нравится «hardcode true и false» -approach. OTOH OP ввел ограничение на true и false, так хорошо ... –

+1

Я надеялся избежать этого, поскольку входное значение также может быть «истинным» или «истинным» или «истинным» и т. д. – Ragnar

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

Остерегайтесь 'value == null' – 2009-11-19 12:18:17

+0

Вы можете обернуть оператор return в конструкцию try/catch, поймать NPE и обработать это исключительное состояние, чтобы вернуть реальное ... просто шутите ;-) –

+1

@lutz - плохой совет. «Нуль» почти наверняка является ошибкой и должен привести к NPE. Тестирование «null», чтобы избежать NPE, почти наверняка затмит ошибку. Вы должны проверить только «null», если явно указано, что значение «null» имеет значение. –

2

Да, но ты не разобрать "ложь" Если вы разбираете? «true», то они верны.

Возможно, Это недоразумение: методы не проверяются, если содержимое String представляет собой логическое значение, они оценивают содержимое String для boolean.

+0

Я тоже понял это. – Ragnar

4

Методы, которые вы вызываете в классе Boolean, не проверяют, содержит ли строка допустимое логическое значение, но они возвращают логическое значение, которое представляет содержимое строки: поместите «true» в строку, они возвращаются true, поместите «false» в строку, они возвращают false.

Вы можете использовать эти методы, однако, для проверки допустимых логических значений, поскольку я ожидаю, что они выдадут исключение, если строка содержит «привет» или что-то не логическое.

Оберните это методом 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 ...

+0

Прекратите дразнить Java-dev с кодом C#. При этом, с необязательным в Java 8, может быть полезно написать небольшую обертку, где Optional.empty указывает на non-bool. – statue

+0

Если вы внимательно прочтете мой ответ, вы увидите, что я не дразня его с кодом C#, но я предлагаю, чтобы он искал методы на Java, которые делают что-то похожее на методы на C#, так как они удобно проверяют и конвертируют. Я не использовал Java в то время, как я уже сказал, поэтому я не уверен, были ли введены такие функции. –

+0

Это была шутка. "поддразнивания." – statue

0

Что-то, что вы также должны учитывать, это обложка символов ...

Вместо:

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

ли это:

return value.equalsIgnoreCase("false") || value.equalsIgnoreCase("true"); 
0

Предлагаю вам взглянуть на документы Java для этих методов. Похоже, вы используете их неправильно. Эти методы не скажут вам, является ли строка допустимым логическим значением, но вместо этого они возвращают логическое значение, установленное в true или false, на основе строки, которую вы передаете, «true» или «false».

http://www.j2ee.me/javase/6/docs/api/java/lang/Boolean.html

3

На самом деле, проверка на булевой типа в виде строки (который является типом) невозможно. В основном вы спрашиваете, как выполнить «сравнение строк».

Как и другие заявленные. Вам нужно определить, когда вы хотите вернуть «true» или «false» (при каких условиях). Вы хотите, чтобы это был случай (в) чувствительный? Что делать, если значение равно нулю?

Я думаю Boolean.valueOf() является вашим другом, Javadoc говорит:

Возвращает Boolean со значением, представленным указанной строки. Возвращаемое значение Boolean представляет значение true, если строковый аргумент не равен null и равен, игнорируя регистр, строке «true».

Пример: Boolean.valueOf («True») возвращает true.
Пример: Boolean.valueOf ("yes") возвращает false.

+0

Nice исследования. Единственное, это не работает с Boolean.valueOf() тоже. – VVB

+0

Можете ли вы быть более конкретным, что вы пытаетесь и что не работает? –

4

Можно также сделать это с помощью регулярных выражений:

Pattern queryLangPattern = Pattern.compile("true|false", Pattern.CASE_INSENSITIVE); 
Matcher matcher = queryLangPattern.matcher(booleanParam); 
return matcher.matches(); 
3
String value = "True"; 
boolean result = value.equalsIgnoreCase("true") ? true : false; 
1

Ну для этого, а также посмотреть на org.apache.commons.lang.BooleanUtils # ToBoolean (java.lang.String) , наряду со многими другими полезными функциями.

+0

Эта утилита не очень полезна в этом случае, поскольку следующее возвращает логическое значение в false: BooleanUtils.toBoolean («космический корабль»); –

8

Apache Обще-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 
0

Вот метод, который вы можете использовать, чтобы проверить, является ли значение булева:

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

Примеры его использования:

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 
0

См оракул документы

public static boolean parseBoolean(String s) { 
     return ((s != null) && s.equalsIgnoreCase("true")); 
    } 
0
function isBooleanString(val) { 
    if (val === "true" || val === "false"){ 
     return true 
    } else { 
     return false 
    } 
    } 
isBooleanString("true") // true 
isBooleanString("false") // true 

isBooleanString("blabla") // false 
+1

Это для JavaScript не Java, но да выглядит хорошо. –

Смежные вопросы