我有一个python函数,用于检查传递的值是否为有效数字。传递的值是字符串格式。
def is_valid_numeral(text_to_check):
'''Check if passed value is a valid numeral figure'''
try:
float(text_to_check)
return True
except ValueError:
return False
传递类似6E+007
的值,此函数返回True,这是正确的。
在上面的函数之后,我需要将传递的数字保存到Decimal字段中。所以我运行format_decimal
函数,如下所示
def format_decimal(value, decimals):
'''Format a value to "n" decimal places
http://mkaz.com/solog/python/python-string-format.html
'''
try:
if decimals == 2:
value = int(value)/100
return "{:.2f}".format(int(value))
except ValueError:
raise
此时,它失败并显示错误:
`Value Error: Invalid literal for int() with base 10:6E+007`
因为这只是一个有效的数字,只是用不同的表示法,是否有一个函数可以为我转换这种类型的值,然后通过format_decimal
函数传递它?
答案 0 :(得分:5)
您通过转换为float
来检查有效性,但实际上是使用int
进行转换 - 这种差异导致了您的问题。
decimal
模块是转换大幅面数字的最佳方式。
>>> int(decimal.Decimal('6E+007'))
60000000
您不希望进行float
然后int
的双重转换,因为这会导致舍入错误。
>>> int(float('1e23'))
99999999999999991611392L
>>> int(decimal.Decimal('1e23'))
100000000000000000000000L
答案 1 :(得分:5)
嗯。你改变了原来的问题; 现在的方式应该是微不足道的:因为你检查是否float()
现在正常工作,只需要与之保持一致:停止使用{ {1}}!也就是说,改为:
int()
但代码仍然混淆:
def format_decimal(value, decimals):
try:
if decimals == 2:
value = float(value)/100
return "{:.2f}".format(value)
except ValueError:
raise
更改为"1234"
吗?"12.34"
不是 2怎么办?然后你的decimals
什么都不做:它"从最后掉下来"所以返回format_decimal()
。None
结构,如所写的那样,除了使代码复杂化之外什么都不做。如果您提供输入字符串及其预期输出字符串的确切示例,那将非常有用。
试试这个?
try/except
这允许指定缩放因子(def format_decimal(value, decimals=2):
from decimal import Decimal
# divide value by 10**decimals; this is just scaling
value = Decimal(value).scaleb(-decimals)
return "{:.{d}f}".format(value, d=decimals)
)。这是示例输入/输出。如果有什么不是你想要的,请准确说出你想要的是什么:
decimals
和输出:
for v in "1", "1234.5678", "1.2e6":
for d in range(4):
print repr(v), d, "->", repr(format_decimal(v, d))
答案 2 :(得分:2)
问题很简单。 6E+007
不是整数表示法,而是浮点表示法。
而不是int('6E+007')
,请先使用float:
int(float('6E+007'))
或者,使用十进制模块:
import decimal
int(decimal.Decimal('6E+007'))
另外,IMO如果你想让数字有两个小数位,你应该使用float,因为整数的值不能包含任何小数分量,并且总是这样。例如,int('1.5')
始终为1
,而不是1.5。
所以只需使用:
value = float(value/100) #Well, i'll keep the division here,
# since i don't know what it's about.
return ":{.2f}".format(value)
希望这有帮助!