복붙노트

[PYTHON] 파이썬에서 통화 문자열을 부동 소수점 숫자로 변환하려면 어떻게해야합니까?

PYTHON

파이썬에서 통화 문자열을 부동 소수점 숫자로 변환하려면 어떻게해야합니까?

특정 통화 형식의 숫자를 나타내는 문자열이 있습니다. 예를 들면 다음과 같습니다.

money="$6,150,593.22"

이 문자열을 숫자로 변환하고 싶습니다.

6150593.22

이것을 달성하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    from re import sub
    from decimal import Decimal
    
    money = '$6,150,593.22'
    value = Decimal(sub(r'[^\d.]', '', money))
    

    이것은 부동 소수점 대신 소수점을 사용하기 때문에 (통화를 나타내는 데 더 낫다) 몇 가지 장점이 있으며 특정 통화 기호를 하드 코딩하지 않아 로캘 문제를 피할 수 있습니다.

  2. ==============================

    2.로캘이 올바르게 설정되어 있으면 locale.atof를 사용할 수 있지만 '$'을 수동으로 제거해야합니다.

    로캘이 올바르게 설정되어 있으면 locale.atof를 사용할 수 있지만 '$'을 수동으로 제거해야합니다.

    >>> import locale
    >>> locale.setlocale(locale.LC_ALL, 'en_US.UTF8')
    'en_US.UTF8'
    >>> money = "$6,150,593.22"
    >>> locale.atof(money.strip("$"))
    6150593.2199999997
    
  3. ==============================

    3.괄호 안에 음수를 포함하도록 확장 :

    괄호 안에 음수를 포함하도록 확장 :

    In [1]: import locale, string
    
    In [2]: from decimal import Decimal
    
    In [3]: n = ['$1,234.56','-$1,234.56','($1,234.56)', '$ -1,234.56']
    
    In [4]: tbl = string.maketrans('(','-')
    
    In [5]: %timeit -n10000 [locale.atof( x.translate(tbl, '$)')) for x in n]
    10000 loops, best of 3: 31.9 æs per loop
    
    In [6]: %timeit -n10000 [Decimal( x.translate(tbl, '$,)')) for x in n]
    10000 loops, best of 3: 21 æs per loop
    
    In [7]: %timeit -n10000 [float( x.replace('(','-').translate(None, '$,)')) for x in n]
    10000 loops, best of 3: 3.49 æs per loop
    
    In [8]: %timeit -n10000 [float( x.translate(tbl, '$,)')) for x in n]
    10000 loops, best of 3: 2.19 æs per loop
    

    쉼표는 반드시 float () / Decimal ()에서 제거해야합니다. float ()는 10-15 배 빨라지지만 정밀도가 떨어지며 로케일 문제를 일으킬 수 있습니다. (10 진수 () )는 정밀도가 있으며 locale.atof ()보다 50 % 빠르지 만 로케일 문제가 있습니다. locale.atof ()가 가장 느리지 만 가장 일반적입니다.

  4. ==============================

    4.통화 위치 또는 기호를 하드 코딩하지 않은 솔루션의 경우 :

    통화 위치 또는 기호를 하드 코딩하지 않은 솔루션의 경우 :

    raw_price = "17,30 €"
    import locale
    locale.setlocale(locale.LC_ALL, 'fr_FR.UTF8')
    conv = locale.localeconv()
    raw_numbers = raw_price.strip(conv['currency_symbol'].decode('utf-8'))
    amount = locale.atof(raw_numbers)
    
  5. ==============================

    5.나는 몇 년 전에 같은 문제를 해결하기 위해이 기능을 만들었다.

    나는 몇 년 전에 같은 문제를 해결하기 위해이 기능을 만들었다.

    def money(number):
        number = number.strip('$')
        try:
            [num,dec]=number.rsplit('.')
            dec = int(dec)
            aside = str(dec)
            x = int('1'+'0'*len(aside))
            price = float(dec)/x
            num = num.replace(',','')
            num = int(num)
            price = num + price
        except:
            price = int(number)
        return price
    
  6. from https://stackoverflow.com/questions/8421922/how-do-i-convert-a-currency-string-to-a-floating-point-number-in-python by cc-by-sa and MIT license