我想验证字符串输入以验证是否可以将其格式化为给定宽度和精度的有效浮点数。
width = 10
precision = 4
value = '12'
try:
"{10.4f}".format(value)
except:
print "not valid"
此测试失败但它应该有效,因为12
可以被视为浮动12.0000
我还希望进行动态测试,因为宽度和精度都是变量。
感谢您的帮助!
答案 0 :(得分:6)
你忘记了:
冒号:
"{:10.4f}".format(float(value))
否则Python会将第一个数字解释为位置参数索引。
每个参数都可以使用它自己的占位符进行设置:
"{value:{width}.{precision}f}".format(
value=float(value), width=width, precision=precision)
在width
格式化之前插入 precision
和value
个参数。
12.234
无法准确表示;二进制分数只能近似它:
>>> format(12.234, '.53f')
'12.23399999999999998578914528479799628257751464843750000'
所以这个价值不适合'你的10.4约束,但看起来像一个完全有效的输入舍入。
任何浮点值都可以格式化为固定宽度,无论如何:
>>> format(10**11 + 0.1, '10.4f')
'100000000000.1000'
不会提出ValueError
; width参数中的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"
答案 1 :(得分:2)
让我们使用Python 3
Format Specifier f"{var}"
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
答案 2 :(得分:0)
我认为这里有类型不匹配......
value = 12
不是
value = '12'
答案 3 :(得分:0)
首先,而不是
"{10.4f}".format(value)
将其写为: &#34; {10.4f}&#34; .format(浮动(值))
转换为首先浮动的字符串
关于如何概括:不要使用字符串&#34; {10.4f}&#34;硬编码,创建它
width = 10
precision = 4
formatting_string = '{' + str(width) + '.' + str(precision) + 'f}'
使用
formatting_string.format(float(value))
答案 4 :(得分:0)
使用string rjust和ljust:
value.rjust(width)+'.'.ljust(precision+1,'0')+'f'
输出:
12.0000f
通过这种方式,我们不需要将value
转换为float