将带有财务缩写的数字字符串转换为float

时间:2019-06-11 03:51:57

标签: python string

我正在尝试转换如下字符串:

s = '1m'
s = '1.4m'
s = '1k'
s = '1.4k'

计算其实际整数(例如'1k'1000),

我想要一个可以调用的函数:

print(tonum('1m'))
print(tonum('1.4m'))
print(tonum('1.45m'))
print(tonum('1k'))
print(tonum('1.4k'))
print(tonum('1.45k'))

输出:

1000000
1400000
1450000
1000
1400
1450

我尝试过:

def tonum(s):
    if '.' in s:
        return int(s.replace('.', '').replace('m', '00000').replace('k', '00'))
    else:
        return int(s.replace('m', '000000').replace('k', '000'))

但是它仅适用于1.4k 1k 1.4m 1m,但不适用于1.45m

2 个答案:

答案 0 :(得分:3)

您可以维护一个词典,并使用该词典查找乘以10的正确幂。

def convert_numeric_abbr(s):
    mapping = {'k': 1000, 'm': 1000000, 'b': 1000000000}
    # Do a check first so it doesn't choke on valid floats     
    if s[-1].isalpha():
        return float(s[:-1]) * mapping[s[-1].lower()]

    return float(s)

convert_numeric_abbr('1m')
# 1000000.0

convert_numeric_abbr('1.4m')
# 1400000.0

convert_numeric_abbr('1k')
# 1000.0

convert_numeric_abbr('1.4k')
# 1400.0

答案 1 :(得分:1)

尽管eval is evil,您可以将其用作概念证明:

def tonum(s):
    return eval(s.replace('k', '*1e3').replace('m', '*1e6'))

作为奖励,这还将正确计算表达式,例如:

tonum("140k + 1m")