将值格式化为带宽度和精度的浮点数

2 投票
5 回答
5836 浏览
提问于 2025-04-17 23:40

我想要验证一个字符串输入,看看它是否可以格式化成一个有效的浮点数,并且要考虑给定的宽度和精度。

width = 10
precision = 4

value = '12'

try:
   "{10.4f}".format(value)
except:
   print "not valid"

这个测试失败了,但它应该能通过,因为 12 可以被看作是浮点数 12.0000

我还想要一个动态测试,因为宽度和精度是变量。

谢谢你的帮助!

5 个回答

0

使用字符串的 rjust 和 ljust 方法:

value.rjust(width)+'.'.ljust(precision+1,'0')+'f'

输出结果:

        12.0000f

这样,我们就不需要把 value 转换成浮点数了。

0

首先,不要这样写:

"{10.4f}".format(value)

而是这样写:

“{10.4f}”.format(float(value))

这样可以先把值转换成浮点数再转成字符串。

关于如何让这个过程更通用:不要把字符串“{10.4f}”写死在代码里,而是创建它:

width = 10
precision = 4
formatting_string = '{' + str(width) + '.' + str(precision) + 'f}'

然后,使用:

formatting_string.format(float(value))
0

我觉得这里有类型不匹配的问题...

value = 12

不是

value = '12'
2

我们来用Python 3吧。

格式说明符 f"{var}"

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # nested fields
'result:      12.35'
8

你忘记加冒号 : 了:

"{:10.4f}".format(float(value))

否则,Python会把第一个数字当作位置参数的索引。

每个参数都可以用自己的占位符来设置:

"{value:{width}.{precision}f}".format(
    value=float(value), width=width, precision=precision)

widthprecision 这些参数会在格式化 value 之前进行插入。

不过,这并不是测试浮点数输入的好方法。浮点值 12.234 不能被精确表示;二进制小数只能近似表示这个值:

>>> format(12.234, '.53f')
'12.23399999999999998578914528479799628257751464843750000'

所以这个值可能不符合你的10.4的限制,但看起来四舍五入后像是一个完全有效的输入。

任何 浮点值都可以格式化为固定宽度,无论如何:

>>> format(10**11 + 0.1, '10.4f')
'100000000000.1000'

不会抛出 ValueError;宽度参数中的 10 意思是:生成一个至少有这么多字符宽的字符串,如果短了就用空格填充,而这个宽度 包括 小数点和小数部分。

要验证浮点输入,最好的方法是测试它是否可以转换为浮点数,然后再测试最小值和最大值:

try:
    value = float(value)
except ValueError:
    # cannot be converted to a valid float
    return "Not a valid input"
else:
    if 0 <= value < 10 ** 11:
        return "Value out of range"

撰写回答