Парсинг string в int

175
14 ноября 2021, 04:50

Есть код, который читает строку и парсит в int. Как заставить видеть переменную s как int?

line0 = line0;
Pattern pattern = Pattern.compile("\\d+\\S?\\d*");
Matcher matcher = pattern.matcher(line0);
while (matcher.find()) {
    String s = matcher.group(0);
    if (s.replaceAll("\\D", " ").length() == s.length()) {
        try {
            integers.add(Integer.parseInt(s));
        } catch (NumberFormatException e) {
        }
    }
}
int i = Integer.parseInt(s);
DaoImpl dao = new DaoImpl();
dao.save(i, line1, line2);

Получаю:

Exception in thread "main" java.lang.NumberFormatException: For input string: "79827956841"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:583)
at java.lang.Integer.parseInt(Integer.java:615)
at com.app.sms.reader.impl.SimpleSmsReader.smsReader(SimpleSmsReader.java:109)
at com.app.sms.reader.impl.SimpleSmsReader.readSms(SimpleSmsReader.java:51)
at com.app.workflow.impl.SimpleSmsWorkflow.processSms(SimpleSmsWorkflow.java:29)
at com.app.starter.Main.main(Main.java:33)
Answer 1

Эта ошибка возникает у Вас потому, что число "79827956841" не умещается в тип int.

Я попробовал вставить его в Integer.parseInt() без кавычек (как целое число) и получил следующую ошибку:

error: integer number too large: 79827956841
       System.out.println(Integer.parseInt(79827956841));

Могу посоветовать Вам использовать тип long.

P. S. Как я понял из Вашего стэк-трейса, число 79827956841 - телефонный номер. В таком случае, возможно, хранить номер в виде числа - не лучшая идея, так как чаще всего над номерами необходимо выполнять именно строковые операции. Ну, по крайней мере, я всегда работал с номерами как со строками. Конечно, я не отрицаю, что хранение в виде числа куда экономнее, так что, если у Вас подобный ход обусловлен именно экономией при хранении, прошу простить.

Answer 2

Число 79827956841 не помещается в знаковое 32 битное (-2 147 483 648 - 2 147 483 647)

Если вам нужно работать с такими большими числами используйте класс Long и соответственно метод Long.parseLong(). Допустимый диапазон значений от -263 до 263-1

READ ALSO
при работе с RecyclerView возникает ошибка java.lang.RuntimeException: Unable to start activity ComponentInfo

при работе с RecyclerView возникает ошибка java.lang.RuntimeException: Unable to start activity ComponentInfo

Пишу что-то вроде текстового редактора, текст в котором добавляется в элементе:

229
Как нарисовать векторное изображение canvas

Как нарисовать векторное изображение canvas

Как используя canvas нарисовать VectorDrawableОбычный Drawable у меня получается нарисовать конвертацией в Bitmap, но как нарисовать VectorDrawable, возможно ли это?

115
Как выстроить структуру классов?

Как выстроить структуру классов?

Дорый день! У меня есть тестовое заданиеКейс сбора данных:

277
return пустой массив

return пустой массив

Как вернуть пустой массив в методе?

74