Преобразование строки в целое число с троичным оператором

У меня есть строка, которую я хотел бы преобразовать в целое число, прежде чем сохранить его как свойство объекта. Хотя я могу использовать обычные операторы 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 покончат с ним, и его будет намного проще поддерживать.

Другие вопросы по тегам