Hallo,
nach langer Zeit habe ich mal wieder eine python Frage, bei der ich mit Suchen nicht weiterkomme:
Ich moechte floating point und/oder integer Zahlen in einen String im "engineer Stil" umwandeln, d.h. in Exponentialschreibweise, aber mit den Exponenten als vielfaches von 3. Und ich wuerde natuerlich gern die precision waehlen koennen.
z.B.:
57458.2 -> 57.46e3
0.24787638 -> 247.88e-3
Gibt es hierfuer schon fertige Funktionen?
Oder vielleicht sogar eine "enhanced string conversion" so dass ich mit dem % Operator arbeiten kann? (im Stil: "%1.3f" %number)
ich habe im Decimal Modul eine .to_string_methode gefunden, aber es erscheint mir etwas umstaendlich eine Zahl erst in ein Decimal umzuwandeln um sie dann in einen string zu konvertieren.
Vielen Dank fuer Hilfe im Vorraus,
Johannes
Float->String conversion im engineer style
Ich finde dort aber nicht das, was Goa sucht ...gkuhl hat geschrieben:Klar gibt's sowas: http://docs.python.org/library/stdtypes ... formatting
Oh, tschuldigung. Ich dachte sowas würde gehen. Dann eben so:
Code: Alles auswählen
In [1]: func = lambda x,e,p: '{0:.{1}f}e{2}'.format(x/10**e,p,e)
In [2]: func(57458.2, 3, 2)
Out[2]: '57.46e3'
In [3]: func(0.24787938, -3, 2)
Out[3]: '247.88e-3'
Musst nur suchen: "%.2e"numerix hat geschrieben:Ich finde dort aber nicht das, was Goa sucht ...gkuhl hat geschrieben:Klar gibt's sowas: http://docs.python.org/library/stdtypes ... formatting
Musst richtig lesen ...Darii hat geschrieben:Musst nur suchen: "%.2e"numerix hat geschrieben:Ich finde dort aber nicht das, was Goa sucht ...gkuhl hat geschrieben:Klar gibt's sowas: http://docs.python.org/library/stdtypes ... formatting
@gkuhl: Und deine "Lösung" ist auch noch keine. Die 10er Potenz muss automatisch als ein Vielfaches von 3 gewählt werden.
Ich wollte auch keine Komplettlösung präsentieren. Wo bleibt denn da der Spaß?numerix hat geschrieben:Und deine "Lösung" ist auch noch keine. Die 10er Potenz muss automatisch als ein Vielfaches von 3 gewählt werden.
Vielen Dank schonmal,
gkuhl hat mich auf eine gute Faehrte gebracht. Da ich natuerlich noch den Exponenten automatisch bestimmen will hab ich mir folgende Funktion gebastelt:
fuer Anregungen bezueglich Steigerung der Eleganz des Codes bin ich weiterhin offen.
gkuhl hat mich auf eine gute Faehrte gebracht. Da ich natuerlich noch den Exponenten automatisch bestimmen will hab ich mir folgende Funktion gebastelt:
Code: Alles auswählen
from __future__ import division
import math
def num2eng(x, p):
"""
function to easily convert a number x (int or float) to
a string in engineer style with precision p
"""
ex, y = divmod(int(math.floor(math.log10(x))) ,3)
ex = 3*ex
pr = p -y if p-y >= 0 else 0
return '{0:.{1}f}e{2}'.format(x/10**ex,pr ,ex)
In Zeile 11 würde es doch auch die max-Funktion tun, oder?
Und zwei weitere Zeichen sparst du in Zeile 10 mit:
Code: Alles auswählen
pr = max(p-y, 0)
Code: Alles auswählen
ex *= 3