将$ 45,000,000.00(str)转换为浮点数

时间:2019-07-28 04:34:13

标签: python

我对python非常陌生,我想将字符串$ 45,000,000.00转换为浮点数。

我通过截断字符串然后将它们添加在一起以非常愚蠢的方式执行此操作...

test_data1 = "$45,300.000"
test_data1_1 = test_data1[1:3]
test_data1_2 = test_data1[4:7]
test_data1_3 = test_data1_1 + test_data1_2

c = float(test_data1_3)

因为在这种情况下,我能够获得45300作为所需的int结果,但是,如果我有类似$ 23,456.78的内容,那我将无法以这种愚蠢的方式进行转换......在那里一种更pythonic的方式做到这一点?非常感谢!

5 个答案:

答案 0 :(得分:5)

如果您的电话号码没有逗号,则可以执行 Mike Sperry在评论中链接的内容 this。但是,由于不是这种情况,您可以尝试以下方法:

money = "$45,000,030.01"
moneyAsFloat = float(money.replace(",", "")[1:])

答案 1 :(得分:0)

或尝试:

>>> test_data1 = "$45,300.234"
>>> float(''.join(test_data1[1:].split(',')))
45300.234
>>> 

答案 2 :(得分:0)

为什么不删除美元符号和逗号,然后转换为浮点数呢?

print(float("$45,300.000".replace('$', '').replace(',', '')))

答案 3 :(得分:0)

这是最通用的解决方案,适用于所有情况!!

In [1]: import re

In [2]: x = re.sub("[^0-9|\.]","","$42,000,000.00")

In [3]: x
Out[3]: '42000000.00'

In [4]: float(x)
Out[4]: 42000000.0

答案 4 :(得分:0)

下面是一个通用的货币解析器,它不依赖于通常用于此类问题的babel库。

import numpy as np
import re

def currency_parser(cur_str):
    # Remove any non-numerical characters
    # except for ',' '.' or '-' (e.g. EUR)
    cur_str = re.sub("[^-0-9.,]", '', cur_str)
    # Remove any 000s separators (either , or .)
    cur_str = re.sub("[.,]", '', cur_str[:-3]) + cur_str[-3:]

    if '.' in list(cur_str[-3:]):
        num = float(cur_str)
    elif ',' in list(cur_str[-3:]):
        num = float(cur_str.replace(',', '.'))
    else:
        num = float(cur_str)

    return np.round(num, 2)

这是一个测试功能的pytest脚本:

import numpy as np
import pytest
import re


def currency_parser(cur_str):
    # Remove any non-numerical characters
    # except for ',' '.' or '-' (e.g. EUR)
    cur_str = re.sub("[^-0-9.,]", '', cur_str)
    # Remove any 000s separators (either , or .)
    cur_str = re.sub("[.,]", '', cur_str[:-3]) + cur_str[-3:]

    if '.' in list(cur_str[-3:]):
        num = float(cur_str)
    elif ',' in list(cur_str[-3:]):
        num = float(cur_str.replace(',', '.'))
    else:
        num = float(cur_str)

    return np.round(num, 2)


@pytest.mark.parametrize('currency_str, expected', [
    (
            '.3', 0.30
    ),
    (
            '1', 1.00
    ),
    (
            '1.3', 1.30
    ),
    (
            '43,324', 43324.00
    ),
    (
            '3,424', 3424.00
    ),
    (
            '-0.00', 0.00
    ),
    (
            'EUR433,432.53', 433432.53
    ),
    (
            '25.675,26 EUR', 25675.26
    ),
    (
            '2.447,93 EUR', 2447.93
    ),
    (
            '-540,89EUR', -540.89
    ),
    (
            '67.6 EUR', 67.60
    ),
    (
            '30.998,63 CHF', 30998.63
    ),
    (
            '0,00 CHF', 0.00
    ),
    (
            '159.750,00 DKK', 159750.00
    ),
    (
            '£ 2.237,85', 2237.85
    ),
    (
            '£ 2,237.85', 2237.85
    ),
    (
            '-1.876,85 SEK', -1876.85
    ),
    (
            '59294325.3', 59294325.30
    ),
    (
            '8,53 NOK', 8.53
    ),
    (
            '0,09 NOK', 0.09
    ),
    (
            '-.9 CZK', -0.9
    ),
    (
            '35.255,40 PLN', 35255.40
    ),
    (
            '-PLN123.456,78', -123456.78
    ),
    (
            'US$123.456,79', 123456.79
    ),
    (
            '-PLN123.456,78', -123456.78
    ),
    (
            'PLN123.456,79', 123456.79
    ),
    (
            'IDR123.457', 123457
    ),
    (
            'JP¥123.457', 123457
    ),
    (
            '-JP\xc2\xa5123.457', -123457
    ),
    (
            'CN\xc2\xa5123.456,79', 123456.79
    ),
    (
            '-CN\xc2\xa5123.456,78', -123456.78
    ),
])
def test_currency_parse(currency_str, expected):
    assert currency_parser(currency_str) == expected