我的家庭作业的一部分是写一个函数来解析一个字符串,如'-.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
我希望有人能给我一些指示。我不希望这个交给我,但我相对困难。我试过对它进行监护编码,试图找出为什么字符串可能不能作为浮动进行转换的原因,但是我永远不会放置足够的墙来确保没有坏字符串出现误报。
感谢。
答案 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')