Python 转换为';6E和x2B;007';十进制

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

我有一个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

完成上述函数后,我需要将传递的数字保存到十进制字段中。因此,我运行了一个
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
但代码仍然很混乱:

  • 你为什么要除以100?您是否确实希望,例如,
    “1234”
    更改为
    “12.34”
  • 如果小数不是2怎么办?然后您的
    格式\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的值时才会看到这一点。