floats mit , als Dezimalpunkt ausgeben

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
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

python3 (aber auch 2.7, macOS 10.15.6):

Ich habe ein Stück python code und möchte floats im deutschen (german) Locale ausgeben, was ich irgendwie nicht hinkriege:

Code: Alles auswählen

#!/usr/bin/python

import locale
locale.setlocale(locale.LC_ALL,'')
print(locale.localeconv())

print(locale.getdefaultlocale()[0])
print("decimal_point:", locale.localeconv()["decimal_point"])
print((float(1)/float(2)))


f=123.456
print(f)
Weiß jemand Rat?
--
Grüße
Christoph
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt locale.format oder locale.str benutzen.
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

Könntest Du das an meinem Beispiel konkretisieren?
--
Grüße
Christoph
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was gibt es da zu konkretisieren? Um Zahlen mit lokalen Einstellungen zu formatieren, braucht man locale.format.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Bzw. zukünftig locale.format_string
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

Sirius3 hat geschrieben: Samstag 26. September 2020, 21:05 Was gibt es da zu konkretisieren? Um Zahlen mit lokalen Einstellungen zu formatieren, braucht man locale.format.
Ich habe es jetzt selber hingekriegt, aber es ist eigentlich nicht die Lösung, die ich vom Sinn des LOCALE erwarte.
Mußte die Strings mit eigenen Wrappern umwandeln. Da könnte ich ja auch eine Funktion schreiben, die einen Punkt in ein Komma umwandelt.

Code: Alles auswählen

#!/usr/bin/python
  
import locale
locale.setlocale(locale.LC_ALL,'')
print(locale.localeconv())

print(locale.getdefaultlocale()[0])
print("decimal_point:", locale.localeconv()["decimal_point"])

print(locale.format_string("%.1f",(float(1)/float(2))))

f=123.456
print(locale.format_string("%.3f",f))
Stelle ich in UNIX (reden wir mal nicht von Windows) das LOCALE ein, so sorgt die Runtime (intrinsisch) dafür, daß die Ausgabe im gesetzten LOCALE erfolgt. Beispiel in C:

Code: Alles auswählen

#include <locale.h>
#include <stdio.h>

int main () {
   double d=123.456;
   printf("Locale is: %s\n", setlocale(LC_ALL, "de_DE"));
   printf("%f\n",d);
   return(0);
}
Die Runtime-Library sorgt dafür, daß die Ausgabe im gewünschten Format erfolgt. Geht das nicht in Python?
--
Grüße
Christoph
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Genau das ist das Problem, dass viele Programme nicht mit locale-Einstellungen zurechtkommen.
Deshalb macht Python da nicht magisch etwas, sondern man muß es explizit angeben.
Beim Lesen der Dokumentation bin ich doch noch auf eine elegantere Lösung gestoßen:

Code: Alles auswählen

d=123.456
print(f"{d:n}")
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Wobei da dass Problem ist, dass man anscheinend die Anzahl der angezeigten Nachkommastellen nicht steuern kann. Und "n" ist bei Gleitkommazahlen wie "g" und nicht wie "f". Das schränkt IMHO ein bisschen sehr ein was man damit erreichen kann.

@Krischu: Das Beispiel sieht komisch aus. Als wenn es Python 2 sein sollte, aber auch nur so halb weil dort dann die "decimal_point"-Ausgabe ein Tupel ausgeben würde wenn man nicht `print_function` aus der Zukunft importiert. In Python 3 machen die `float()`-Aufrufe keinen Sinn.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

__blackjack__ hat geschrieben: Sonntag 27. September 2020, 12:14 @Krischu: Das Beispiel sieht komisch aus. Als wenn es Python 2 sein sollte, aber auch nur so halb weil dort dann die "decimal_point"-Ausgabe ein Tupel ausgeben würde wenn man nicht `print_function` aus der Zukunft importiert. In Python 3 machen die `float()`-Aufrufe keinen Sinn.
Dieses

Code: Alles auswählen

float(1)/float(2) 
hatte ich aus irgendeinem online-Beispiel mitgeschleppt. Danke für den Hinweis.
--
Grüße
Christoph
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

In Python 2 wäre es auch nur nötig gewesen eine der beiden Zahlen in eine Gleitkommazahl zu wandeln. Und wenn man mit literalen Zahlen arbeitet dann auch eher in dem man da gleich ein Gleitkommaliteral schreibt. Also beispielsweise ``1.0 / 2``.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten