Как я могу разобрать String на int со значением по умолчанию?

Мне нужно преобразовать строковый идентификатор пользователя в целое число, для которого я использовал Integer.parseInt(String s), но он возвращает null/nil, если строка имеет/содержит недесятичное/целочисленное значение, и в этом случае мне нужно назначить целочисленное значение по умолчанию как 0.

Я пробовал это, но (? 0) кажется, что это не работает, и я не знаю, правильный ли это синтаксис или нет.

String userid = "user001";
int int_userid = Integer.parseInt(userid) ? 0;

Как можно присвоить значение по умолчанию целому числу, если есть нулевое назначение?

Строковый идентификатор пользователя является аргументом параметра как часть вызова функции веб-службы, поэтому я не могу обновить его тип данных до целого числа.


person Krunal    schedule 03.08.2017    source источник
comment
Вы изобрели синтаксис, которого нет в Java. parseInt выдает исключение, если не может разобрать строку. В этом случае вы можете catch сделать исключение.   -  person khelwood    schedule 03.08.2017
comment
но он возвращает ноль, если строка имеет нецелочисленное значение. Нет, это не так. Метод, возвращающий int, не может возвращать значение null. Выдает исключение.   -  person Michael    schedule 03.08.2017
comment
Когда вы запустите программу, вы должны увидеть исключение в консоли eclipse.   -  person deepakl    schedule 03.08.2017
comment
Вот: stackoverflow.com/a/1486521/1898563   -  person Michael    schedule 03.08.2017
comment
Есть ли способ справиться с этой ситуацией/проблемой?   -  person Krunal    schedule 03.08.2017
comment
@Майкл, спасибо, дорогой, позволь мне попробовать   -  person Krunal    schedule 03.08.2017


Ответы (8)


Вы можете попробовать этот метод с регулярным выражением.

public static int parseWithDefault(String s, int defaultVal) {
    return s.matches("-?\\d+") ? Integer.parseInt(s) : defaultVal;   
}
person dev_kd    schedule 03.08.2017
comment
Это не сработает, если значение превышает диапазон int. - person Florian F; 09.01.2020

Скорее всего, вы уже используете apache.commons.lang3:

NumberUtils.toInt(str, 0);
person msfoster    schedule 03.08.2017
comment
Это лучше всех - person minhas23; 18.11.2019

Этот синтаксис не будет работать для Integer.parseInt(), потому что он приведет к NumberFormatException

Вы можете справиться с этим следующим образом:

String userid = "user001";
int int_userid;
try {
   int_userid = Integer.parseInt(userid);
} catch(NumberFormatException ex) {
   int_userid = 0;
}

Обратите внимание, что имена ваших переменных не соответствуют Соглашению о коде Java


Лучшим решением было бы создать для этого собственный метод, потому что я уверен, что он понадобится вам не раз:

public static int parseToInt(String stringToParse, int defaultValue) {
    try {
       return Integer.parseInt(stringToParse);
    } catch(NumberFormatException ex) {
       return defaultValue; //Use default value if parsing failed
    }
}

Затем вы просто используете этот метод, например, например:

int myParsedInt = parseToInt("user001", 0);

Этот вызов возвращает значение по умолчанию 0, поскольку «user001» не может быть проанализирован.

Если вы удалите «пользователя» из строки и вызовете метод...

int myParsedInt = parseToInt("001", 0);

…тогда синтаксический анализ будет успешным и вернет 1, так как int не может иметь ведущие нули!

person Yannick    schedule 03.08.2017
comment
Откуда вы придумали p_ex?? - person xenteros; 03.08.2017
comment
Просто имя переменной тут нечего выдумывать - person Lars; 03.08.2017
comment
Это просто переменная для NumberFormatException. Вы можете использовать его как p_ex.printStackTrace() - person Yannick; 03.08.2017
comment
Я знаю. Вопрос в том, что послужило причиной того, что вы назвали переменную Java таким образом? - person xenteros; 03.08.2017
comment
Ах я вижу. Я использую p_ для объявления переменной в качестве параметра - person Yannick; 03.08.2017

Вы можете использовать этот способ с String::matches следующим образом:

String userid = "user001";
int int_userid = userid.matches("\\d+") ? Integer.parseInt(userid) : 0;

Вы также можете использовать -?\d+ как для положительных, так и для отрицательных значений:

int int_userid = userid.matches("-?\\d+") ? Integer.parseInt(userid) : 0;
person YCF_L    schedule 03.08.2017
comment
Разве это не мой отрицательный голос, и я не гуру регулярных выражений, но это кажется окольным путем, и не будет ли это ошибкой для отрицательных чисел? - person PeterJ; 03.08.2017
comment
@PeterJ как насчет сейчас? :) - person YCF_L; 03.08.2017
comment
@YCF_L идеальная чрезмерная инженерия: D - person xenteros; 03.08.2017
comment
Ты сделал это. Отлично - person sForSujit; 03.08.2017
comment
У меня такое ощущение, что для таких ответов был подготовлен не настоящий ответ: p - person xenteros; 03.08.2017
comment
@YCF_L выглядит лучше, но не потребуется ли также проверка границ, чтобы убедиться, что его можно сопоставить с целым числом? - person PeterJ; 03.08.2017
comment
да @PeterJ правильно, в моем решении я использую регулярное выражение, а диапазон int находится между -2147483648 и 2147483647, так что это может работать, но с большим шаблоном, я выберу решение (Янник или xenteros) вместо того, чтобы использовать try catch is лучший способ в этом случае ;) - person YCF_L; 03.08.2017

Это может быть немного чрезмерным, но вы можете использовать Ints.tryParse(String) Guava с дополнительными опциями Java 8 следующим образом:

int userId = Optional.ofNullable(Ints.tryParse("userid001")).orElse(0)
person mgyongyosi    schedule 04.08.2017
comment
Это вводит дополнительную упаковку и распаковку. - person Miha_x64; 17.04.2020

Я считаю, что вы можете достичь того, чего хотите, следующим методом:

public static int parseIntWithDefault(String s, int default) {
    try {
        return Integer.parseInt(s);
    } catch(NumberFormatException e) {
        return default;
    }
}

а теперь просто назначьте:

int int_userid = parseIntWithDefault(userId, 0);

Имейте в виду, что при использовании Java следует использовать передовой опыт Java в отношении форматирования кода. int_userid определенно есть что улучшить.

person xenteros    schedule 03.08.2017
comment
Быстрый вопрос, обычно использующий try/catch для обработки логического потока, является антипаттерном. Я думаю, в этом сценарии это единственный вариант, верно? Является ли проверка того, что s не равно нулю и создается только с использованием цифр, точек или такого рода проверки, лучше? - person rahpuser; 10.01.2020

String userid = "user001";
int int_userid = Integer.parseInt(userid) != null ? Integer.parseInt(userid) : 0);

Вы имели в виду этот синтаксис? Но поскольку int никогда не может быть null, вам нужно вместо этого сделать:

String userid = "user001";
int int_userid;
try { 
    int_userid= Integer.parseInt(userid);
} catch (NumberFormatexception e) {
    int_userid = 0;
}
person xoX Zeus Xox    schedule 03.08.2017

person    schedule
comment
Слушай, это один из ответов, но единственный, в котором нет даже слова, чтобы объяснить... - person xenteros; 03.08.2017
comment
Но это не должно быть причиной отрицательного голосования, в любом случае, я бы помнил об этом. - person deepakl; 03.08.2017
comment
Ответы с пояснениями более полезны для будущих посетителей и с большей вероятностью получат одобрение. Голоса в комментариях не учитываются для репутации, поэтому они часто используются для обозначения согласия. Если вы считаете, что комментарий слишком болтлив и его следует удалить, вы всегда можете пометить его, чтобы модератор обратил на него внимание. - person user812786; 03.08.2017