2

我有一个 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函数传递它?

4

3 回答 3

5

您正在通过转换为 来检查有效性float,但实际上是在进行转换int- 差异导致了您的问题。

decimal模块是转换大格式数字的最佳方式。

>>> int(decimal.Decimal('6E+007'))
60000000

您不想对floatthen进行双重转换,int因为这会导致舍入错误。

>>> int(float('1e23'))
99999999999999991611392L
>>> int(decimal.Decimal('1e23'))
100000000000000000000000L
于 2013-10-23T04:40:03.920 回答
5

唔。你改变了原来的问题;现在的方式应该是微不足道的:既然您正在检查现在是否float()有效,请与此保持一致:停止使用int()!也就是改成这样:

def format_decimal(value, decimals):
    try:
        if decimals == 2:
            value = float(value)/100
            return "{:.2f}".format(value)
    except ValueError:
        raise

但是代码仍然很混乱:

  1. 为什么要除以 100?你真的想要,例如,"1234"变成"12.34"吗?
  2. 如果decimals 不是2怎么办?然后你format_decimal()什么都不做:它“从头上掉下来”,所以返回None
  3. 捕获异常并立即重新引发它与一开始就不想捕获它是一样的。也就是说,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))

和输出:

'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'
于 2013-10-23T04:43:06.160 回答
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)

希望这可以帮助!

于 2013-10-23T04:41:16.823 回答