将'6E + 007'转换为十进制

时间:2013-10-23 04:04:02

标签: 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的值,此函数返回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函数传递它?

3 个答案:

答案 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()

但代码仍然混淆:

  1. 你为什么要除以100?您真的想要,例如def format_decimal(value, decimals): try: if decimals == 2: value = float(value)/100 return "{:.2f}".format(value) except ValueError: raise 更改为"1234"吗?
  2. 如果"12.34" 不是 2怎么办?然后你的decimals什么都不做:它"从最后掉下来"所以返回format_decimal()
  3. 抓住一个例外并立即重新提升它就像开始时没有抓住它一样。也就是说,None结构,如所写的那样,除了使代码复杂化之外什么都不做。
  4. 如果您提供输入字符串及其预期输出字符串的确切示例,那将非常有用。

    泛化

    试试这个?

    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)

希望这有帮助!