Seite 1 von 1

locale.currency() und umgekehrt

Verfasst: Montag 13. Februar 2012, 16:55
von Humbalan
Hallo Leute,

mein py-Programm, das u. a. Artikelpreise verwaltet, arbeitet intern mit float für diese Preise. Zur Darstellung in einer GUI kann ich diese Werte mit dem locale-Modul leicht umwandeln in einen "currency"-String (locale.currency(floatWert)).

Frage: geht das genauso einfach auch umgekehrt? Also locale.myfunction(currencyStr) liefert einen passenden float-Wert. Bisher helfe ich mir mit currencyStr.split(" ")[0]. Das finde ich unschön u. v. a. muss ich mich darauf verlassen dass in jedem Fall der currencyStr die Form <Wert>" €" hat.

Kann jemand helfen? Würde mich freuen.

Grüße
Humbalan

Re: locale.currency() und umgekehrt

Verfasst: Montag 13. Februar 2012, 17:27
von cofi
Suchst du locale.format? Auf das `monetary` argument achten.

Re: locale.currency() und umgekehrt

Verfasst: Montag 13. Februar 2012, 17:32
von BlackJack
@Humbalan: Wofür brauchst Du die Rückrichtung denn? Wenn irgendwo ein Betrag eingegeben werden soll, dann würde ich gar kein Währungszeichen in der Eingabe erwarten.

Re: locale.currency() und umgekehrt

Verfasst: Montag 13. Februar 2012, 17:37
von Humbalan
Hallo cofi,
danke für die schnelle Antwort. locale.format() liefert wie locale.currency() einen str, der aus dem float val gemacht wird. Ich suche nach der Umkehrfunktion. Eine Funktion myfunction(), die die Bedingung

Code: Alles auswählen

val == myfunction(locale.currency(val))
erfüllt
Grüße
Humbalan

Re: locale.currency() und umgekehrt

Verfasst: Montag 13. Februar 2012, 17:42
von Humbalan
BlackJack hat geschrieben:@Humbalan: Wofür brauchst Du die Rückrichtung denn? Wenn irgendwo ein Betrag eingegeben werden soll, dann würde ich gar kein Währungszeichen in der Eingabe erwarten.
Hallo Blackjack,
vielen Dank für die schnelle Antwort.
Ich habe ein UI, in der die Preise sowohl in wx.Grids als auch in wx.txtCtrl gespeichert sind, jeweils mit Währungszeichen. Die Grids dienen der Anzeige, die txtCtrls der Eingabe. Damit ist die Umwandlung in beide Richtungen notwendig. Deine Frage hat mich allerdings zu der Überlegung gebracht, ob es wirklich angebracht ist, das Währungszeichen mit in den Widgets abzuspeichern, statt neben das Widget zu schreiben. Das könnte jedenfalls bei den txtCtrl klappen, bei den Grids nur dann, wenn sie wirklich immer nur zur Anzeige dienen (sprich "write only" aus Programmsicht). Werde mal darüber nachdenken.
Grüße
Humbalan

Re: locale.currency() und umgekehrt

Verfasst: Montag 13. Februar 2012, 17:49
von cofi
Oh my bad. Wie BlackJack sehe ich den Sinn hier nicht wirklich.

Da hilft nur eine Kombination aus `locale.atof` und `str.rfind`:

Code: Alles auswählen

In [3]: import locale

In [4]: locale.setlocale(locale.LC_ALL, 'de_DE')
Out[4]: 'de_DE'

In [5]: c = locale.currency(20000.4)

In [6]: c
Out[6]: '20000,40 EUR'

In [8]: locale.atof(c[:c.rfind(' ')])
Out[8]: 20000.4

In [9]: c = locale.currency(20000.4, grouping=True)

In [10]: locale.atof(c[:c.rfind(' ')])
Out[10]: 20000.4

In [11]: c
Out[11]: '20.000,40 EUR'
Edit: Wobei natuerlich der Hinweis nicht fehlen, darf dass FP Zahlen nichts fuer Geldbetraege sind.

Re: locale.currency() und umgekehrt

Verfasst: Montag 13. Februar 2012, 18:02
von BlackJack
@cofi: Geht aber wie vom OP schon angemerkt nur wenn die Währung hinter dem Zahlwert steht und nicht davor, oder gar davor *und* danach etwas steht.

Re: locale.currency() und umgekehrt

Verfasst: Montag 13. Februar 2012, 23:46
von Humbalan
Nochmal danke für Eure Hilfe.

Zum Verständnis: ich habe in der Kürze der ersten Erklärungen unterschlagen, dass im Eingabefeld bereits ein vorformulierter Wert einschl. Währungszeichen steht. Da kann der Bediener natürlich einen neuen Wert, auch ohne Einheit, das funktioniert auch schon. Er kann aber auch in dem vorhandenen Wert editieren. Da ist dann die Einheit vorhanden. Ich wollte dabei den Bediener nicht zwingen, bei einem sinnvollen Währungswert erst einmal die Einheit aus dem Eingabefeld zu löschen, damit mein Programm damit arbeiten kann. Das war nun aber nicht mein Problem, das krieg ich schon hin, ob der Bediener nun ein Leerzeichen zw. Zahl und Einheit macht, ob er ein Dezimalkomma oder einen -punkt verwendet, ob das Währungszeichen vor oder hinter dem Wert steht. Was mich interessiert hat, war schlicht die Frage: wenn Python so etwas nettes wie currency() zur Verfügung stellt, das locale-abhängig eine float-Zahl in einen länderspezifischen String umwandelt ohne dass ich mir alle Details dafür aus dem Betriebssystem fieseln müsste, gibt's dann nicht auch das Umgekehrte? Jetzt im Augenblich hat es den Anschein, dass nicht. Schade.

Oh, und danke für die Bemerkung mit der Darstellung von Geldbeträgen als float. Hat mich angeregt, über decimal nachzudenken.

Grüße
Humbalan

Re: locale.currency() und umgekehrt

Verfasst: Dienstag 14. Februar 2012, 08:14
von cofi
Macht es vielleicht Sinn die Waehrung aus dem Eingabefeld zu nehmen? Zum Beispiel als Label (wenn sie fix ist) oder als Combobox (wenn sie waehlbar ist) daneben.

Ich glaube die meisten Probleme in der Richtung liessen sich vermeiden, wenn man auf die Moeglichkeiten der GUI-Oberflaeche zurueckgreift.

Re: locale.currency() und umgekehrt

Verfasst: Dienstag 14. Februar 2012, 14:47
von lunar
@Humbalan: Was verwendest Du denn für die Eingabe der Währung? Sprich, welches GUI-Toolkit und welches Steuerelement aus diesem Toolkit?

Re: locale.currency() und umgekehrt

Verfasst: Dienstag 14. Februar 2012, 16:00
von Humbalan
@cofi: Die Währung separat darzustellen, habe ich auch schon erwogen. Das würde einiges vereinfachen. Finde ich nur optisch nicht so ansprechend. Aber vielleicht gewöhne ich mich dran.
@lunar: Die Währung wird nicht eingegeben. Das Programm zeigt wx.txtCtrl-Felder und wx.Grid-Tabellen, die den Betrag einschl. Währung enthalten. Bei den Grids gibts keine Probleme, weil die nur zur Anzeige dienen, das geht gut mit locale.currency().