Преобразование строки в целое число с троичным оператором
У меня есть строка, которую я хотел бы преобразовать в целое число, прежде чем сохранить его как свойство объекта. Хотя я могу использовать обычные операторы if, я хотел использовать троичную операцию, чтобы лучше понять ее. Вот код, который я пробовал
field_num = (((boolean bool_is_int = is_integer(string)) == true) ? (Integer int = Integer.parseInt(string)) : null);
То, что я пытаюсь сделать (очень в основном), это установить "field_num" (который имеет тип int
) к значению "string", если оно равно целому числу (сначала преобразовав его). is_integer
это функция, которую я должен проверить, если строка равна целому числу Возвращает логическое значение.
Спасибо за любую помощь.
5 ответов
Я бы сделал что-то вроде этого:
Integer theint = is_integer(thestr) ? Integer.parseInt(thstr) : null;
Вы не можете присвоить NULL внутреннему int, но вы можете объекту Integer. Обычно, конечно, вы просто полагаетесь на вызов parseInt(), генерирующий исключение, а не на явную проверку целочисленности строки заранее.
Вы должны просто использовать оператор if/else. Тернарный оператор полезен, когда вы хотите установить переменную в одно из двух значений на основе условия. В вашем примере вы не хотите устанавливать значение, если строка не является целым числом, поэтому троичный не очень хорошо вписывается в ситуацию.
Будь проще:)
int field_num = isInt(string) ? Integer.parseInt(string) : Integer.MAX_VALUE;
if (field_num == Integer.MAX_VALUE) {
// error; string is not a valid representation of int
}
Чтобы определить, является ли String
представляет собой int
значение:
public static boolean isInt(String s) {
try {
Integer.parseInt(s);
} catch(NumberFormatException e) {
return false;
}
return true;
}
field_num = is_integer(string) ? Integer.parseInt(string): -1;
На простом английском языке это говорит, что если 'string' является целым числом, то нужно проанализировать строку для int и установить ее в field_num, в противном случае установите в -1. -1 произвольно. вместо этого вы должны использовать номер, недопустимый для field_num.
Вам не нужно is_integer(string) == true, потому что это соответствует тому же значению, что и is_integer(string). Вам также не нужно устанавливать логическое значение bool_is_int, потому что, если вам не нужно это значение позже в программе.
[Исправленный]
Учиться одной вещи за раз.
Во-первых, оператор?: (Чаще называемый условным оператором или оператор if/else; "троичный" просто означает, что он принимает три аргумента, и это единственный оператор C, который делает это, поэтому возникает путаница)...
field_num = is_integer(string) ? Integer.parseInt(string) : null;
Ааа. Таким образом, field_num является целым числом. Помогла бы, если бы ты сказал это.
Второе: назначение при передаче. Если вы не знаете, что вам нужно сделать это, и вы не можете сделать совершенно очевидным, что вы делаете и почему, НЕ делайте. Это трудно читать, и это редко уместно.
Кроме того, "int" не является допустимым именем переменной.
Но если вы настаиваете:
Integer myint;
boolean bool_is_int;
field_num = (bool_is_int = is_integer(string)) ? (myint = Integer.parseInt(string)) : null;
Какова ценность myint в случае false/else? Это оставлено как то, что было установлено ранее. Это может быть то, что вы хотели, но кто-то читает ваш код очень трудно понять.
В большинстве случаев, разве что?: Очень простой, который можно прочитать с первого взгляда - (foo!=null) ? foo.doSomething() : defaultValue
- вам лучше использовать реальное выражение if/then/else. Вероятно, это будет столь же эффективно после того, как компилятор и JIT покончат с ним, и его будет намного проще поддерживать.