将值格式化为带宽度和精度的浮点数
我想要验证一个字符串输入,看看它是否可以格式化成一个有效的浮点数,并且要考虑给定的宽度和精度。
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)
width
和 precision
这些参数会在格式化 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"