Python 转换为';6E和x2B;007';十进制
我有一个python函数,它检查传递的值是否为有效数字。传递的值为字符串格式Python 转换为';6E和x2B;007';十进制,python,exponential,Python,Exponential,我有一个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
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
完成上述函数后,我需要将传递的数字保存到十进制字段中。因此,我运行了一个format\u 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`
由于这确实是一个有效的数字,只是用不同的符号表示,是否有一个函数可以为我转换这种类型的值,然后通过
格式\u decimal
函数传递它?您正在通过转换为float
来检查有效性,但是实际上,使用int
进行转换-这种差异会导致您的问题
decimal
模块是转换大格式数字的最佳方式
>>> int(decimal.Decimal('6E+007'))
60000000
您不希望执行到float
然后int
的双重转换,因为这可能会导致舍入错误
>>> int(float('1e23'))
99999999999999991611392L
>>> int(decimal.Decimal('1e23'))
100000000000000000000000L
问题很简单
6E+007
不是整数表示法,而是浮点表示法
不要使用int('6E+007')
,首先使用浮点:
int(float('6E+007'))
或者,使用十进制模块:
import decimal
int(decimal.Decimal('6E+007'))
此外,在我看来,如果您希望数字有两位小数,那么应该使用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)
希望这有帮助 嗯。你改变了原来的问题;现在的方式应该很简单:既然您现在正在检查
float()
是否工作,那么请保持一致:停止使用int()
!也就是说,更改为:
def format_decimal(value, decimals):
try:
if decimals == 2:
value = float(value)/100
return "{:.2f}".format(value)
except ValueError:
raise
但代码仍然很混乱:
“1234”
更改为“12.34”
格式\u 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)
允许指定比例因子(小数
)。下面是输入/输出示例。如果有什么东西不是你想要的,准确地说出你想要的是什么:
for v in "1", "1234.5678", "1.2e6":
for d in range(4):
print repr(v), d, "->", repr(format_decimal(v, d))
以及输出:
'1' 0 -> '1'
'1' 1 -> '0.1'
'1' 2 -> '0.01'
'1' 3 -> '0.001'
'1234.5678' 0 -> '1235'
'1234.5678' 1 -> '123.5'
'1234.5678' 2 -> '12.35'
'1234.5678' 3 -> '1.235'
'1.2e6' 0 -> '1200000'
'1.2e6' 1 -> '120000.0'
'1.2e6' 2 -> '12000.00'
'1.2e6' 3 -> '1200.000'
但这是一个数字。。这只是写它的另一个符号。它仍然会返回true,那么这个练习有什么意义呢?In:int(6E+007)Out:60000000@aIKid我对问题进行了编辑,以反映真正的问题。因此,这仍然是一个有效的数额。问题是,在验证之后,我需要将其转换为十进制notation@Yohann什么意思?我已经运行了
int(6E+00
,但仍然失败,原因是ValueError:invalid literal for int()以10为基数:“6E+007”
1。用例是我需要将所有值转换为2位小数。2.该函数中的decimals
参数由我控制。目前我只需要2位小数,但将来如果我需要3位小数,我将添加一个elif decimals==3
…3.获得有关最佳处理这个问题的方法?实际上,我从未完全掌握python中的错误处理:-(请给出输入字符串及其预期输出字符串的确切示例。我知道您正在尝试,但您的英文描述不清楚。例如,您是否希望生成字符串“12.34”
对于输入字符串“1234”
?我不知道。@TimPeters嘿,Tim,你应该加入:)。+1作为舍入观察值。所以int(十进制。十进制(值))
非常理想,因为它可以在不舍入的情况下为您提供正确的输出。@lukik,Python中的int
可能比float
具有更好的精度,这就是我添加警告的原因。您只有在处理大于9e15的值时才会看到这一点。