2016-12-07 63 views
6

Pracuję nad projektem, w którym muszę przeanalizować ceny. Muszę wziąć pod uwagę różne formaty cen.Szukasz uniwersalnego sposobu analizy ceny na dziesiętną

Problemy:

US obywatele pisać ceny w ten sposób: 1,000.00

UE w ten sposób: 1.000,00

To bardzo problem może być rozwiązany za pomocą przecinków dzielenie ciąg i kropki tak ostatnią pozycją na liście będzie cent. Problem polega na tym, że czasami ludzie nie piszą centów, więc ktoś mógłby napisać na przykład 1000 euro.

A są inne problemy ... czasami ludzie nie piszą kropek.

Czy znasz jakiś moduł lub funkcję Pythona, które mogą rozwiązać ten problem i zwrócić decimal.Decimal ceny? Nie obchodzi mnie waluta.

EDYCJA: Załóżmy, że będę mieć tysiące cen w takich formatach.

+0

miałem okiem na module locale, jak @lucasnadaluti sugerowane i wpadł następujących linii kodu: 'locale.setlocale (locale.LC_ALL, '') ', aby ustawić domyślny kraj, a następnie po prostu' locale.currency (1000, symbol = False, grouping = True) ', aby uzyskać wartość – sonrad10

Odpowiedz

2

Ten kod wykorzystuje tę logikę: ''

  • jeśli nie lub "," są obecne, po prostu konwertuj na zmienne
  • jeśli "," lub "." są trzecim znakiem od końca, to jest dziesiętny znak:

    . strip, a następnie znak dziesiętny, zmień znak dziesiętny na "." jeśli to konieczne, a następnie przekształcić się unosić

  • inny

    . nie podano części dziesiętnej, po prostu usuń wszystkie "," i "." i przekształcić się unosić

Kod ten jest bardzo uzależniona od uzyskania prawidłowych ciągów - nieprawidłowe ciągi jak "1,2,3.000" lub "1..." da błędne wartości.

def parse_price(s): 
    if '.' not in s and ',' not in s: 
     return float(s) 

    elif s[-3] in ',.': 
     dec_char = s[-3] 
     sep_char = {'.': ',', ',':'.'}[dec_char] 
     s = s.replace(sep_char, '') 
     s = s.replace(',', '.') 
     return float(s) 

    else: 
     s = s.replace(',','').replace('.', '') 
     return float(s) 

tests = """\ 
1.000 
1.000,20 
23.14 
1,234 
1.23 
3,12 
""".splitlines() 
for test in tests: 
    print(test, '->', parse_price(test)) 

daje

1.000 -> 1000.0 
1.000,20 -> 1000.2 
23.14 -> 23.14 
1,234 -> 1234.0 
1.23 -> 1.23 
3,12 -> 3.12