Округление с использованием регулярных выражений - PullRequest
8 голосов
/ 28 сентября 2011

Можно ли использовать регулярное выражение для округления числа?Проблема в том, что у меня есть много чисел в более чем 2 десятичных разрядах в файле, и мне нужно переместить их в 2 десятичных разряда.

Это в исходном файле, так что в идеале я хотел бы использоватьVisual Studio находит и заменяет, но я не против идеи написания сценария для запуска файла (рассматривая его как простой текст), если регулярное выражение не имеет ответа.

Ответы [ 4 ]

7 голосов
/ 28 сентября 2011

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

В 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'

Регулярное выражение для сопоставления десятичных дробей очень упрощено;например, оно не соответствует экспоненциальной нотации, но должно дать вам представление.

5 голосов
/ 28 сентября 2011

Я не думаю, что вы можете округлить числа, так как регулярные выражения не могут сложить.

Вы можете обрезать их следующим образом (это будет работать в Notepad ++):

найти (\d*\.\d\d)\d*

заменить на \1

3 голосов
/ 28 сентября 2011

Ну ... по крайней мере, вы можете найти (\d+\.\d\d\d)\d* и заменить его на round($1, 2).

Да, возможно, это не то, что вы ожидали:)

0 голосов
/ 18 января 2014

Я только что придумал простой способ сделать это для округления результатов в наборе результатов 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?)

Тогда округляется и усекается .

...