Округление с использованием регулярных выражений
Можно ли использовать регулярное выражение для округления числа? Проблема в том, что у меня есть много чисел в более чем 2 десятичных разрядах в файле, и мне нужно переместить их в 2 десятичных разряда.
Он находится в исходном файле, поэтому в идеале я бы хотел использовать поиск и замену в Visual Studio, но я не против идеи написания сценария для запуска файла (обработки его как простого текста), если регулярное выражение не имеет ответа,
4 ответа
Как указал Райан, вы не можете сделать это только с помощью регулярных выражений, но вы можете использовать регулярные выражения, чтобы найти десятичные дроби во входных данных и использовать функцию обратного вызова в операции замены.
В Python:
>>> import re
>>> text = "1.234 and 99.999; .555 12.345"
>>> simpledec = re.compile(r"\d*\.\d+")
>>> def mround(match):
... return "{:.2f}".format(float(match.group()))
...
>>> re.sub(simpledec, mround, text)
'1.23 and 100.00; 0.56 12.35'
Регулярное выражение для сопоставления десятичных дробей очень упрощено; например, оно не соответствует экспоненциальной нотации, но должно дать вам представление.
Я не думаю, что вы можете округлить числа, так как регулярные выражения не могут сложить.
Вы можете обрезать их следующим образом (это будет работать в Notepad++):
находить (\d*\.\d\d)\d*
заменить \1
Ну... по крайней мере, вы можете искать (\d+\.\d\d\d)\d*
и заменить его на round($1, 2)
,
Да, возможно, это не то, что вы ожидали:)
Я только что придумал простой способ сделать это для округления результатов в наборе результатов Google BigQuery - их подмножество SQL не позволяет вам округлять до определенного десятичного знака, но поддерживает регулярные выражения.
Поскольку, как кто-то упоминал выше, регулярные выражения не могут быть добавлены, тогда, пока вы можете каким-либо образом добавить константу к каждому значению, вы все равно можете получить остаток пути:
+ 0.5 if you're rounding up to the nearest integer
+ 0.05 if you are rounding up to the nearest 0.1
+ 0.005 if you are rounding up to the nearest 0.01 etc.
... и т. д. - обычно добавьте половину наименьшего значения точности, чтобы получить эффект округления.
А затем запустите извлечение регулярных выражений для результата. Вышеуказанные, вероятно, будут работать для этого.
Вот шаблон регулярного выражения, на котором я остановился - он не самый надежный, но будет работать с числом, которое, как известно, уже имеет базовый формат с плавающей точкой:
+ for 0.1 precision use (-?\d*\.?\d?)
+ for 0.01 precision use (-?\d*\.?\d?\d?)
+ for 0.001 precision use (-?\d*\.?\d?\d?\d?)
Тогда это и округлено и усечено.