Seite 1 von 1

Float->String conversion im engineer style

Verfasst: Mittwoch 24. März 2010, 18:35
von Goa
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

Verfasst: Mittwoch 24. März 2010, 18:39
von gkuhl

Verfasst: Mittwoch 24. März 2010, 19:05
von numerix
gkuhl hat geschrieben:Klar gibt's sowas: http://docs.python.org/library/stdtypes ... formatting
Ich finde dort aber nicht das, was Goa sucht ...

Verfasst: Mittwoch 24. März 2010, 19:16
von gkuhl
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'

Verfasst: Mittwoch 24. März 2010, 19:48
von Darii
numerix hat geschrieben:
gkuhl hat geschrieben:Klar gibt's sowas: http://docs.python.org/library/stdtypes ... formatting
Ich finde dort aber nicht das, was Goa sucht ...
Musst nur suchen: "%.2e"

Verfasst: Mittwoch 24. März 2010, 20:05
von numerix
Darii hat geschrieben:
numerix hat geschrieben:
gkuhl hat geschrieben:Klar gibt's sowas: http://docs.python.org/library/stdtypes ... formatting
Ich finde dort aber nicht das, was Goa sucht ...
Musst nur suchen: "%.2e"
Musst richtig lesen ... :wink:

@gkuhl: Und deine "Lösung" ist auch noch keine. Die 10er Potenz muss automatisch als ein Vielfaches von 3 gewählt werden.

Verfasst: Mittwoch 24. März 2010, 20:35
von gkuhl
numerix hat geschrieben: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ß?

Verfasst: Donnerstag 25. März 2010, 11:47
von Goa
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:

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) 
fuer Anregungen bezueglich Steigerung der Eleganz des Codes bin ich weiterhin offen.

Verfasst: Donnerstag 25. März 2010, 12:32
von Trichter
In Zeile 11 würde es doch auch die max-Funktion tun, oder?

Code: Alles auswählen

pr = max(p-y, 0)
Und zwei weitere Zeichen sparst du in Zeile 10 mit:

Code: Alles auswählen

ex *= 3
:wink: