Float->String conversion im engineer style

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Goa
User
Beiträge: 18
Registriert: Dienstag 10. Oktober 2006, 11:00

Mittwoch 24. März 2010, 18:35

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
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Mittwoch 24. März 2010, 18:39

Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 24. März 2010, 19:05

gkuhl hat geschrieben:Klar gibt's sowas: http://docs.python.org/library/stdtypes ... formatting
Ich finde dort aber nicht das, was Goa sucht ...
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Mittwoch 24. März 2010, 19:16

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'
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Mittwoch 24. März 2010, 19:48

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"
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 24. März 2010, 20:05

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Mittwoch 24. März 2010, 20:35

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ß?
Goa
User
Beiträge: 18
Registriert: Dienstag 10. Oktober 2006, 11:00

Donnerstag 25. März 2010, 11:47

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.
Trichter
User
Beiträge: 45
Registriert: Montag 20. April 2009, 10:21

Donnerstag 25. März 2010, 12:32

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:
Antworten