Seite 1 von 1

floats mit , als Dezimalpunkt ausgeben

Verfasst: Samstag 26. September 2020, 16:14
von Krischu
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?

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Samstag 26. September 2020, 16:39
von Sirius3
Du mußt locale.format oder locale.str benutzen.

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Samstag 26. September 2020, 20:52
von Krischu
Könntest Du das an meinem Beispiel konkretisieren?

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Samstag 26. September 2020, 21:05
von Sirius3
Was gibt es da zu konkretisieren? Um Zahlen mit lokalen Einstellungen zu formatieren, braucht man locale.format.

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Samstag 26. September 2020, 22:32
von sparrow
Bzw. zukünftig locale.format_string

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Sonntag 27. September 2020, 10:39
von Krischu
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?

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Sonntag 27. September 2020, 11:14
von Sirius3
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}")

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Sonntag 27. September 2020, 12:14
von __blackjack__
@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.

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Sonntag 27. September 2020, 13:55
von Krischu
__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.

Re: floats mit , als Dezimalpunkt ausgeben

Verfasst: Sonntag 27. September 2020, 14:00
von __blackjack__
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``.