2013-05-23 13 views
9

W języku Python, jaki jest najprostszy sposób przekonwertowania liczby ujętej w nawiasy (łańcuch) na ujemną liczbę całkowitą (lub zmiennoprzecinkową)?Konwersja liczby ujętej w nawiasy (łańcuch) na ujemną liczbę całkowitą (lub zmienną) przy użyciu Pythona?

Na przykład, "(4301)" do -4301, jak zwykle spotykane w aplikacjach księgowych.

+1

Nie znam wbudowanego sposobu, aby to zrobić. Możesz sparsować całkowitą liczbę oddzieloną przecinkami od ['locale'] (http://stackoverflow.com/questions/1779288/how-do-i-use-python-to-convert-a-string-to-a-number -if-it-ma-przecinki-w-tego-tego-tego), ale musisz sam sobie poradzić z negatywnym nastawieniem. – katrielalex

+1

Dziwne, istnieje 'locale.currency', aby przejść w drugą stronę, ale chcesz odwrócić to, czego nie mogę znaleźć. To samo pytanie zostało zadane już tutaj i nie ma zadowalających odpowiedzi http://stackoverflow.com/q/8421922/674039 – wim

Odpowiedz

12

Najprostszym sposobem jest:

my_str = "(4,301)" 
num = -int(my_str.translate(None,"(),")) 
+0

+1 za pokazanie mi tłumaczenia! – boatcoder

+0

+1 fot. Z tego samego powodu, co @ Mark0978 –

+1

Wow, tłumaczenie jest niesamowite! – ecline6

7

Skoro czytasz od systemu, który umieścić w separatory tysięcy, to warto wspomnieć, że nie są używane w ten sam sposób na całym świecie, dlatego cię powinien rozważyć użycie systemu lokalizacji. Rozważmy:

import locale 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 
my_str = "(4,301)" 
result = -locale.atoi(my_str.translate(None,"()")) 
+0

+1 za zezwolenie na różne separatory. – Schorsch

+3

Dziękuję Sir. Jestem w Danii i doświadczam wszelkiego rodzaju bzdur ze względu na "interesujące" lokalizacje ... – mogul

2

Zakładając prostu usuwając , jest wystarczająco bezpieczny, a może chcesz zastosować tę samą funkcję z wartościami, które mogą zawierać liczb ujemnych czy nie, to:

import re 
print float(re.sub(r'^\((.*?)\)$', r'-\1', a).replace(',','')) 

Można by wtedy para że przy użyciu locale jak inne odpowiedzi wykazały, np:

import locale, re 

locale.setlocale(locale.LC_ALL, 'en_GB.UTF-8') 
print locale.atof(re.sub('^\((.*?)\)$', r'-\1', a)) 
0

Kod ten może być nieco dłuższe, ale proste i łatwe do utrzymania

from pyparsing import Word, nums, OneOrMore 

integer = Word(nums) 

text = "blah blah (4,301) blah blah " 

parser = OneOrMore(integer) 

iterator = parser.scanString(text) 

try: 
    while True: 
     part1 = iterator.next() 
     part2 = iterator.next() 
except: 
    x = part1[0][0][0] + '.' +part2[0][0][0] 
    print -float(x) 

Produkuje: -4.301

2

Przypuszczalnie chcesz obsługiwać liczby dodatnie, jak i ujemne, których brakuje wielu odpowiedzi do tej pory. Zamierzam dodać trochę do answer from mogul.

import locale 
locale.setlocale(locale.LC_ALL, '') 
my_str = '(4,301)' 
positive = my_str.translate(None, '()') 
result = locale.atoi(positive) if positive == my_str else -locale.atoi(positive) 
Powiązane problemy