我怎么能一直像转换“3.71B”和“4M”字符串到数字在Python?(How can I cons

2019-09-21 02:00发布

我几乎产生从雅虎财经有形股价/帐面价值的公司(被称为一个不错的模块,而一些错位的代码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]

这是非常混乱的,但我想如果这是可行的,而不是

.replace('M','000000').replace('B','000000000').replace('.','') 

我用用变量正则表达式。 我想这个问题很简单,其正则表达式和变量。 其他建议也不错。

编辑:

具体而言,我希望能有一些零,一个或两个小数的数字作品,但这些问题的答案都期待有帮助。

Answer 1:

>>> 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')

您可以int()的结果,如果你想太多



Answer 2:

解析数字作为浮筒,并使用一个乘法器映射:

multipliers = dict(M=10**6, B=10**9)
def sharesNumber(nodeText):
    nodeText = nodeText.strip()
    mult = 1
    if nodeText[-1] in multipliers:
        mult = multipliers[nodeText[-1]]
        nodeText = nodeText[:-1]
    return float(nodeText) * mult


Answer 3:

num_replace = {
    'B' : 1000000000,
    'M' : 1000000,
}

a = "4.9M" 
b = "10.89B" 

def pure_number(s):
    mult = 1.0
    while s[-1] in num_replace:
        mult *= num_replace[s[-1]]
        s = s[:-1]
    return float(s) * mult 

pure_number(a) # 4900000.0
pure_number(b) # 10890000000.0

这将像白痴工作:

pure_number("5.2MB") # 5200000000000000.0

而且由于字典方法,可以为你在一个简单的想办法保持在一个资本形式表达自己的字典键,然后做一个添加尽可能多的后缀,并且可以使其更加宽松.lower().upper()使之匹配。



Answer 4:

num_replace = {
    'B' : 'e9',
    'M' : 'e6',
}

def str_to_num(s):
    if s[-1] in num_replace:
        s = s[:-1]+num_replace[s[-1]]
    return int(float(s))

>>> str_to_num('3.71B')
3710000000L
>>> str_to_num('4M')
4000000

所以'3.71B' - > '3.71e9' - > 3710000000L等。



Answer 5:

这可能是安全地使用eval的机会! :-)

考虑下面的代码片段:

>>> d = { "B" :' * 1e9', "M" : '* 1e6'}
>>> s = "1.493B"
>>> ll = [d.get(c, c) for c in s]
>>> eval(''.join(ll), {}, {})
1493000000.0

现在把它放在一起变成一个整洁的一个班轮:

d = { "B" :' * 1e9', "M" : '* 1e6'}

def human_to_int(s):
    return eval(''.join([d.get(c, c) for c in s]), {}, {})

print human_to_int('1.439B')
print human_to_int('1.23456789M')

回馈:

1439000000.0
1234567.89


文章来源: How can I consistently convert strings like “3.71B” and “4M” to numbers in Python?