代码之家  ›  专栏  ›  技术社区  ›  U13-Forward

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

  •  1
  • U13-Forward  · 技术社区  · 5 年前

    我试图转换字符串,比如:

    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 .

    3 回复  |  直到 5 年前
        1
  •  3
  •   cs95 abhishek58g    5 年前

    您可以维护一个字典,并使用它来查找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
    
        2
  •  1
  •   Selcuk    5 年前

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

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

    另外,这还可以正确计算表达式,例如:

    tonum("140k + 1m")