1

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

我尝试了很多事情。第一个也是最基本的当然是 try: except:。尝试将其转换为浮点数并让 Python 完成繁重的工作。但是,据我所见,它可以返回的错误对于这个分配来说不够描述。

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

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

我希望这里有人能给我一些指示。我不想把这个交给我,但我相对卡住了。我尝试对其进行监护人编码,试图找出字符串可能无法作为浮点数转换的原因,但我永远无法建立足够的墙来确保没有坏字符串得到误报。

谢谢。

4

1 回答 1

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')
于 2012-10-23T01:41:59.533 回答