如何将"3.71B"和"4M"等字符串始终转换为Python中的数字?

rof*_*fls 5 python regex finance yahoo-finance

我有一些相当严重的代码,几乎可以为雅虎财务公司制作有形的价格/账簿(一个很好的模块已经ystockquote获得了无形的价格/账面价值).

我的问题是:

对于计算中的一个变量,我发现的股票有10.89B4.9M,其中BM分别为亿百万.我无法将它们转换为数字,这就是我所处的位置:

shares=''.join(node.findAll(text=True)).strip().replace('M','000000').replace('B','000000000').replace('.','') for node in soup2.findAll('td')[110:112]
Run Code Online (Sandbox Code Playgroud)

这是非常混乱的,但我认为如果不是,它会起作用

.replace('M','000000').replace('B','000000000').replace('.','') 
Run Code Online (Sandbox Code Playgroud)

我正在使用带变量的正则表达式.我想这个问题只是简单的正则表达式和变量.其他建议也很好.

编辑:

具体来说,我希望有一些适用于零,一或两位小数的数字,但这些答案看起来都很有帮助.

jam*_*lak 14

>>> from decimal import Decimal
>>> d = {
        'M': 6,
        'B': 9
}
>>> def text_to_num(text):
        if text[-1] in d:
            num, magnitude = text[:-1], text[-1]
            return Decimal(num) * 10 ** d[magnitude]
        else:
            return Decimal(text)

>>> text_to_num('3.17B')
Decimal('3170000000.00')
>>> text_to_num('4M')
Decimal('4000000')
>>> text_to_num('4.1234567891234B')
Decimal('4123456789.1234000000000')
Run Code Online (Sandbox Code Playgroud)

int()如果你也想要你的结果

  • 哈哈,代码大战!你们太棒了,它们不仅是整数,而且你们的任何一个解决方案都足够了,因为它不需要那么具体。不过,每种情况都只有两位小数,所以据我所知,@jamylak 实际上赢得了代码之战。不幸的是,我对你们两个人的解决方案都不满意,但我认为这是我的错,因为 @jamylak 已经证明每个人的代码都工作正常;)我选择他的答案,部分是因为他的热情,部分是因为我的上层注释(最多两位小数),尽管 int 假设不正确。谢谢! (2认同)