Округление с использованием регулярных выражений

Можно ли использовать регулярное выражение для округления числа? Проблема в том, что у меня есть много чисел в более чем 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?)

Тогда это и округлено и усечено.

Другие вопросы по тегам