2012-10-10 13 views
6

Pytanie dotyczy Pythona 2.6, czyli tego, co mamy w produkcji.Jak sformatować liczbę przecinkami i określoną dokładnością cyfr w Pythonie

Mam to wymaganie, aby sformatować liczbę (np. 1234567.0987 lub 1234567.0) za pomocą przecinka i określoną liczbę cyfr po przecinku dziesiętnym. Tak więc, jeśli precyzja wynosi trzy, 1234567.0987 może wyglądać jak 1 234 577,099.

Próbowałem używać ustawień regionalnych, jak sugerują odpowiedzi na wiele pytań, problem polega na tym, że wyniki są dwuznaczne po przecinku, co jest niedopuszczalne w przypadku moich wymagań.

Próbowałem szukając w innych miejscach, ale nie znaleźliśmy żadnego rozwiązania, a na końcu stworzyłem metodę przez mój własny:

def format_float(value, precision = 4): 
    formatString = "%0." + str(precision) + "f"  
    str_val = formatString % value 
    first, second = str_val.split('.') 
    first = int(first) 
    group = [] 
    while True: 
     result, mod = first/1000, first % 1000 
     group.append(str(mod)) 
     if result == 0: 
      break 
     first = result 
    group.reverse() 
    return ','.join(group) + '.' + second 

Próbowałem uruchomić kilka testów, aby przetestować metodę i działa dobrze :

# default 4 digits precision 
assert format_float(1234567890.0876543) == '1,234,567,890.0877' 
assert format_float(1.2) == '1.2000' 
assert format_float(1234) == '1,234.0000' 
assert format_float(0) == '0.0000' 

# 3 digits precision 
assert format_float(1234567890.0876543, precision=3) == '1,234,567,890.088' 
assert format_float(0, precision=3) == '0.000' 

Będąc nowością w Pythonie, moje pytanie brzmi, czy jest to dopuszczalne rozwiązanie. Ponieważ formatowanie to musi odbywać się wiele razy w ciasnej pętli for, byłbym wdzięczny, gdyby ktoś wskazał lepsze rozwiązanie.

Dzięki i Pozdrowienia dla wszystkich

+2

Wypróbuj za pomocą '1000000'. –

+0

Mark, dziękuję. To jest jeden dobry błąd, muszę to naprawić. – cspider

+1

Nie musisz używać modułu 'locale'. Zobacz moją odpowiedź na pytanie [_Jaka jest najprostsza metoda dodawania przecinków do liczby całkowitej w Pythonie?] (Http://stackoverflow.com/q/3909457/355230). – martineau

Odpowiedz

18

Nie sądzę wyglądałaś wystarczająco głęboko do modułu locale. locale.format() jest tym, czego potrzebujesz, ale upewnij się, że ustawiłeś najpierw ustawienia regionalne lub w ogóle nie będziesz grupować.

>>> locale.setlocale(locale.LC_ALL, '') 
'en_US.UTF-8' 
>>> locale.format("%.4f", 12345.678912, grouping=True) 
'12,345.6789' 
+0

locale aware FTW ... –

+1

+1 nigdy nie wiedział o module "locale". –

+0

@cdhowie, dziękuję, to działa dla mnie, nawet z. Przeszukałem opcję format(). – cspider

12

dla Pythona 2.7 i 3.x można zrobić coś takiego:

>>> num=1234567890.0876543 
>>> "{0:,f}".format(num) 
'1,234,567,890.087654' 
>>> "{0:,.2f}".format(num) 
'1,234,567,890.08' 
>>> "{0:,f}".format(1234) 
'1,234.000000' 
+0

Ah, pokonaj mnie. Nawiasem mówiąc, działa to również w wersji 2.7.3. – kreativitea

+0

@kreativitea Po prostu sprawdziło to w Internecie. Próbowałem go tylko na python 2.6, gdzie nie działa. –

+0

Dziękuję jednak, że zredagowałem moje oryginalne pytanie, że to pytanie dla Pythona 2.6. – cspider

Powiązane problemy