2011-06-20 14 views
5

This question prosi o tłumienie notacji naukowej w python.Jak uniknąć drukowania notacji naukowej w python bez dodawania dodatkowych cyfr?

Mam serię liczb do wyświetlenia - małe moce 10 - i chciałbym wyświetlić je bez zer końcowych. To znaczy. 0.1, 0.01 i tak dalej do 0.000001

Jeśli wykonam "%s" % 10 ** -6, otrzymam '1e-06'. Jeśli użyję "%f" % 10 ** -6, otrzymam '0.000001', czego chcę.

Jednak "%f" % 10 ** -3 daje '0.001000', co narusza ograniczenie "bez końcowych zer".

Nietrudno jest brutalnie wymuszać obejście tego (zastąpienie regexem lub coś podobnego), ale zastanawiam się, czy brakuje jakiejś magii napisów w formacie.

Odpowiedz

7

Wydaje mi trochę hacky, ale można użyć str.rstrip("0") pozbyć zer:

>>> "{:f}".format(10**-6).rstrip("0") 
'0.000001' 
>>> "{:f}".format(10**-3).rstrip("0") 
'0.001' 

EDIT: Jak powiedział w komentarzach, nie ma lepszego sposobu na to:

>>> format(1e-6, 'f').rstrip('0') 
'0.000001' 
>>> format(1e-3, 'f').rstrip('0') 
'0.001' 
+0

To właśnie PO, określane jako * "brutalnie wymusza naokoło" *, więc nie jest to prawdziwa odpowiedź (-1). Jednak zrobiłbym to w ten sposób (+1). –

+0

+1. To wcale nie jest hacky. Może użycie funkcji 'format()' jest odrobinę prostsze: 'format (1e-6, 'f'). Rstrip ('0')'. –

+0

@Oben Sonne, ale jest o wiele lepszy niż przy użyciu regex. @Ferdinand Beyer, dzięki, nie wiedziałem o tym, modyfikując odpowiedź. – utdemir

2

prosta rstrip("0") nie obsługuje małe i niektóre inne wartości dobrze, powinien zostawić jedno zero po przecinku - 0.0 zamiast 0.:

def format_float(value, precision=-1): 
    if precision < 0: 
     f = "%f" % value 
    else: 
     f = "%.*f" % (precision, value) 

    p = f.partition(".") 

    s = "".join((p[0], p[1], p[2][0], p[2][1:].rstrip("0"))) 

    return s 

print(format_float(3e-10)) 
print(format_float(3e-10, 20)) 
print(format_float(1.5e-6)) 
print(format_float(1.5e+6)) 
Powiązane problemy