格式化值以浮动和宽度和精度浮动

Bel*_*dar 2 python floating-point

我想验证一个字符串输入,以验证它是否可以格式化为给定宽度和精度的有效浮点数.

width = 10
precision = 4

value = '12'

try:
   "{10.4f}".format(value)
except:
   print "not valid"
Run Code Online (Sandbox Code Playgroud)

这个测试失败但它应该有效,因为12可以认为是一个浮点数12.0000

我还想进行动态测试,因为宽度和精度是变量.

谢谢您的帮助!

Mar*_*ers 7

你忘记了:冒号:

"{:10.4f}".format(float(value))
Run Code Online (Sandbox Code Playgroud)

否则Python将第一个数字解释为位置参数索引.

每个参数都可以使用它自己的占位符进行设置:

"{value:{width}.{precision}f}".format(
    value=float(value), width=width, precision=precision)
Run Code Online (Sandbox Code Playgroud)

width并且precisionvalue格式化之前插入参数.

然而,这对于浮点输入来说不是一个好的测试.浮点值12.234无法准确表示; 二进制分数只能近似它:

>>> format(12.234, '.53f')
'12.23399999999999998578914528479799628257751464843750000'
Run Code Online (Sandbox Code Playgroud)

所以这个值不会"适合"你的10.4约束,但看起来像一个完全有效的输入舍入.

在任何情况下,任何浮点值都可以格式化为固定宽度:

>>> format(10**11 + 0.1, '10.4f')
'100000000000.1000'
Run Code Online (Sandbox Code Playgroud)

没有ValueError将提高; 的10在宽度参数是指:产生一个字符串,它是至少这许多个字符宽,垫用空格,如果它是较短的,并且该宽度包括小数点和小数.

要验证浮点输入,您可以做的最好的事情是测试它是否可以转换为float,然后测试mininum和maxmimum值:

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"
Run Code Online (Sandbox Code Playgroud)