Как считать из строки целые числа и числа с плавающей точкой?

Есть такой код, который из строки считывает целые числа:

System.out.println("Enter: ");
String input = in.nextLine();
System.out.println(input.replaceAll("\\s", ""));

Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(input);

ArrayList <Double> Al = new ArrayList<>();
    
while (matcher.find()) {
    Al.add(Double.valueOf(matcher.group()));
}

Как изменить код, чтобы можно было также считать отрицательные числа и числа с плавающей точкой?


Ответы (1 шт):

Автор решения: Nowhere Man

Для проверки отрицательных чисел достаточно добавить опциональный минус: "-?\\d+".

Вероятно, также следует разрешить унарный плюс перед числом: "[-+]?\\d+".

Для проверки чисел с плавающей запятой следует определиться с форматом, в наиболее привычном случае (без разделителей тысяч и с фиксированным десятичным разделителем .) получится такой шаблон: "[-+]?\\d+(\\.\\d*)?".
Также допустим вариант с пустой целой частью и непустой дробной, тогда придётся объединить несколько вариантов при помощи логического ИЛИ (|): "[-+]?(\\d+(\\.\\d*)?|\\.\\d+)", см. онлайн демо
Для значений с экспоненциальной записью понадобится отдельный шаблон.

Поэтому если задача всё же заключается в считывании нескольких чисел из строки, изобретение своего костыльно-велосипедного решения с регулярными выражениями вовсе не требуется.

Если нужно просто прочитать эти несколько чисел в любом корректном виде, проще и правильнее воспользоваться готовым классом Scanner и его методами hasNextDouble / nextDouble, тем более что экземпляр сканера уже используется в исходном примере кода:

System.out.println("Enter number(s): ");

List<Double> nums = new ArrayList<>();
while (in.hasNextDouble()) {
    nums.add(in.nextDouble());
}

Разумеется, при таком способе может потребоваться установка корректной локали для сканера.

→ Ссылка