如何使用Python高效地对由数字组成的字符串进行四舍五入?

carvr3hs  于 2022-12-05  发布在  Python
关注(0)|答案(3)|浏览(132)

使用Python 3...
我编写了对ArcGIS符号系统标注值进行舍入的代码。标注以字符串形式给出,如“0.3324 - 0.6631”。我的可重复代码是...

label = "0.3324 - 0.6631"
label_list = []
label_split = label.split(" - ") 
for num in label_split:
    num = round(float(num), 2) # rounded to 2 decimals
    num = str(num)
    label_list.append(num) 
label = label_list[0]+" - "+label_list[1]

这段代码可以工作,但是有没有人有什么建议/更好的方法来舍入字符串中的数字?

hgtggwj0

hgtggwj01#

此解决方案不尝试对序列进行操作,而是对2个值进行操作。
对我来说更有可读性。

x, _, y = label.partition(" - ")
label = f"{float(x):.2f} - {float(y):.2f}"
pcww981p

pcww981p2#

您可以使用正则表达式来搜寻超过两个小数位数的数字,并将其四舍五入。
正则表达式\b\d+\.\d+\b将查找字符串中所有被单词边界包围的带小数点的数字。它被单词边界包围是为了防止它拾取附加在单词上的数字,例如ABC0.1234
正则表达式(Try online)的解释:

\b\d+\.\d+\b

\b        \b     : Word boundary
  \d+  \d+       : One or more digits
     \.          : Decimal point

re.sub函数允许您指定一个函数,该函数将match对象作为输入,并返回所需的替换值。让我们定义这样一个函数,该函数将数字解析为float,然后使用f-string syntax将其格式化为两位小数(您可以按自己喜欢的方式格式化它,我喜欢这种方式)

def round_to_2(match):
    num = float(match.group(0))
    return f"{num:.2f}"

要使用此函数,只需将此函数指定为re.subrepl参数

label = "0.3324 - 0.6631 ABC0.1234 0.12 1.234 1.23 123.4567 1.2"
label_rep = re.sub(r"\b\d+\.\d+\b", round_to_2, label)

这样得到label_rep为:

'0.33 - 0.66 ABC0.1234 0.12 1.23 1.23 123.46 1.20'

这样做的好处是,您不需要硬编码任何分隔符或拆分字符。字符串中的所有数字都会被找到并格式化。请注意,如果需要,这样会在数字中添加额外的零。

bwleehnv

bwleehnv3#

一种稍微不同的方法:

label = "0.3324 - 0.6631"
'{:.2f}-{:.2f}'.format(*map(float,label.split('-')))

>>>
'0.33-0.66'

相关问题