解析字符串以查看它是否可以转换为浮点数

时间:2012-10-23 00:29:02

标签: python validation floating-point

我的家庭作业的一部分是写一个函数来解析一个字符串,如'-.4e-4',并找出任何会阻止它被强制转换为浮点数的问题。例如,在'10e4.5'中,我需要检测指数中的小数,并提供相关的错误消息。

我尝试了很多事情。第一个,当然,最基本的是尝试:除了:尝试将它转换为浮动并让Python完成繁重的任务。但是,据我所知,它可以返回的错误对于此分配来说不够具有描述性。

我尝试的第二件事是将字符串规范化,用n替换所有数字,用s替换符号,用d代替小数,用e代替指数(来自C的maketrans函数使得这非常快)。然后,我将任何重复的n减少到单个n。我列出了所有有效的浮点格式,并检查了规范化字符串是否在该列表中。 AKA,我把它列入白名单。它完美而且非常省时,但同样没有错误检查。该代码发布在下面。

import string,time
check_float_trans = string.maketrans("nsd0123456789-+.","???nnnnnnnnnnssd")
check_float_valids = 'n sn sndn ndn ndnen dn sdn sdnen sdnesn dnesn dnen nen nesn snesn sn snen sndnen sndnesn ndnesn'.split()
def check_float( test ):
    """Check if string <test> could be cast as a float, returns boolean."""
    test = test.translate(check_float_trans)
    test = ''.join([a for a,b in zip(test, ' '+test) if a != b])
    return test in check_float_valids

我希望有人能给我一些指示。我不希望这个交给我,但我相对困难。我试过对它进行监护编码,试图找出为什么字符串可能不能作为浮动进行转换的原因,但是我永远不会放置足够的墙来确保没有坏字符串出现误报。

感谢。

1 个答案:

答案 0 :(得分:0)

这就是我要做的......(也是未经测试的)

def isValid(expression):

    if 'e' in expression:
        number, exponent = expression.split('e')
    else:
        print "not a valid format, no 'e' in expression"
        return False

    # a bunch of other if statments here to check for
    #certain conditions like '.' in the exponent component

    return float(number) ** float(exponent)


if __name__ == '__main__':
    print isValid('-.4e-4')
    print isValid('10e4.5')