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

Python 将带有财务缩写的数字字符串转换为float,python,string,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 1

我试图转换字符串,如:

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
您可以维护一个字典,并使用它查找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)

尽管如此,您可以将其用作概念证明:

def tonum(s):
    return eval(s.replace('k', '*1e3').replace('m', '*1e6'))
作为奖励,这还将正确计算表达式,例如:

tonum("140k + 1m")

不错的答案,但是感冒的答案,因为它没有
eval
:PVery Nice,只是一个注释,在Python3中我们也可以写:
'b':1_000_000
(PEP515)
tonum("140k + 1m")