Как считать из строки целые числа и числа с плавающей точкой?
Есть такой код, который из строки считывает целые числа:
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 шт):
Для проверки отрицательных чисел достаточно добавить опциональный минус: "-?\\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());
}
Разумеется, при таком способе может потребоваться установка корректной локали для сканера.