Warum wandelt sprintf Dezimalpunkte in Kommas?
Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 11:02:41 von Markus Hochholzer
Hallo,
in einer Datenstruktur gibt es z. B. folgendes Schlüssel- Wertepaar:
$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED} = 100
Mit dem sprintf-Befehl formatiere ich den Wert auf zwei Nachkommastellen
$tmp = sprintf("%.2f", $$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED});
Aber anstatt "100.00" wird immer "100,00" ausgegeben.
Was muß ich einstellen, daß sprintf die "Finger" vom Dezimaltrennzeichen
läßt?
Grüße Markus
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 11:22:14 von Mirco Wahab
Markus Hochholzer wrote:
> Mit dem sprintf-Befehl formatiere ich den Wert auf zwei Nachkommastellen
> $tmp = sprintf("%.2f", $$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED});
> Aber anstatt "100.00" wird immer "100,00" ausgegeben.
> Was muß ich einstellen, daß sprintf die "Finger" vom Dezimaltrennzeichen
> läßt?
{
use POSIX;
setlocale(LC_NUMERIC, "de_DE");
my $tmp = sprintf("%.2f", $$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED});
print "$tmp\n";
}
==> 100,00
{
use POSIX;
setlocale(LC_NUMERIC, "en_US");
my $tmp = sprintf("%.2f", $$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED});
print "$tmp\n";
}
==> 100.00
(perldoc locale)
Viele Grüße
M.
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 11:28:34 von Jan Teune
Hi Markus...
Vielleicht ein paar mehr Infos? System etc pp ?
ich hab das Bsp mal auf das folgende runtergekocht:
#!/usr/bin/perl -w
use strict;
my %var;
$var{PUNKTELISTE}[0]{JOINT_SPEED} = 100;
print $var{PUNKTELISTE}[0]{JOINT_SPEED},"\n";
my $tmp = sprintf("%.2f",$var{PUNKTELISTE}[0]{JOINT_SPEED});
print $tmp,"\n";
Ausgabe:
100
100.00
Sieht doch alles super aus :)
Gruss Jan
Markus Hochholzer schrieb:
> Hallo,
>
> in einer Datenstruktur gibt es z. B. folgendes Schlüssel- Wertepaar:
> $r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED} = 100
>
> Mit dem sprintf-Befehl formatiere ich den Wert auf zwei Nachkommastellen
> $tmp = sprintf("%.2f", $$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED});
>
> Aber anstatt "100.00" wird immer "100,00" ausgegeben.
>
> Was muß ich einstellen, daß sprintf die "Finger" vom Dezimaltrennzeichen
> läßt?
>
> Grüße Markus
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 13:20:13 von Markus Hochholzer
Mirco Wahab schrieb:
>> Aber anstatt "100.00" wird immer "100,00" ausgegeben.
> {
> use POSIX;
> setlocale(LC_NUMERIC, "de_DE");
> my $tmp = sprintf("%.2f", $$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED});
> print "$tmp\n";
> }
>
> ==> 100,00
>
> {
> use POSIX;
> setlocale(LC_NUMERIC, "en_US");
> my $tmp = sprintf("%.2f", $$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED});
> print "$tmp\n";
> }
>
> ==> 100.00
Ich habe das Beispiel bei mir probiert.
use POSIX;
setlocale(LC_NUMERIC, "de_DE");
my $zahl = '100,039777';
my $tmp = sprintf("%.2f", $zahl);
print "$tmp\n";
==> 100.00
In meinem Programm funktioniert das nicht, da bleibt es immer beim Komma :-(
Habe auch schon die Zeichenkodierung mehrmals umgestellt!
Übrigens: Ich verwende Perl 5.8.8 und Komodo 3.5.
Gruß Markus
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 14:29:17 von Ingo Menger
Markus Hochholzer schrieb:
> Hallo,
>
> in einer Datenstruktur gibt es z. B. folgendes Schlüssel- Wertepaar:
> $r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED} =3D 100
>
> Mit dem sprintf-Befehl formatiere ich den Wert auf zwei Nachkommastellen
> $tmp =3D sprintf("%.2f", $$r_Programm{PUNKTELISTE}[$i]{JOINT_SPEED});
>
> Aber anstatt "100.00" wird immer "100,00" ausgegeben.
>
> Was muß ich einstellen, daß sprintf die "Finger" vom Dezimaltrennzeic=
hen
> läßt?
Das können wir Dir höchstwahrscheinlih sagen, wenn Du uns sagst, was
folgende Kommandos (bzw. deren Äquivalente auf Deinem OS) ausgeben:
grep locale "deinskript.pl"
env | grep LC
echo $LANG
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 15:21:35 von Mirco Wahab
Markus Hochholzer wrote:
> use POSIX;
> setlocale(LC_NUMERIC, "de_DE");
> my $zahl = '100,039777';
> my $tmp = sprintf("%.2f", $zahl);
> print "$tmp\n";
>
> ==> 100.00
>
> In meinem Programm funktioniert das nicht, da bleibt es immer beim Komma
> :-(
> Habe auch schon die Zeichenkodierung mehrmals umgestellt!
Versuch mal:
use strict;
use warnings;
{
my $z = '100.039777';;
my $t = sprintf( "%.2f", $z );
print "$t\n";
}
{
use POSIX;
my $z = '100,039777';;
my $t = sprintf( "%.2f", strtod( $z ) );
print "$t\n";
}
M.
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 15:40:48 von Markus Hochholzer
Ingo Menger schrieb:
> Das können wir Dir höchstwahrscheinlih sagen, wenn Du uns sagst, was
> folgende Kommandos (bzw. deren Äquivalente auf Deinem OS) ausgeben:
>
> grep locale "deinskript.pl"
> env | grep LC
> echo $LANG
Nun,
$locale_values = localeconv();
for (sort keys %$locale_values) {
printf "%-20s = %s\n", $_, $locale_values->{$_}
}
liefert mir decimal_point = ,
Hab es jetzt schon mit setlocale(LC_ALL, "en_US"); versucht, aber ohne
Erfolg. Aus perllocale - Perl locale handling: Formats are the only part
of Perl that unconditionally use information from a program's locale; if
a program's environment specifies an LC_NUMERIC locale, it is always
used to specify the decimal point character in formatted output.
Formatted output cannot be controlled by use locale because the pragma
is tied to the block structure of the program, and, for historical
reasons, formats exist outside that block structure.
Gruß Markus
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 15:48:49 von Markus Hochholzer
Mirco Wahab schrieb:
> Versuch mal:
>
> use strict;
> use warnings;
>
> {
> my $z = '100.039777';;
> my $t = sprintf( "%.2f", $z );
> print "$t\n";
> }
>
> {
> use POSIX;
> my $z = '100,039777';;
> my $t = sprintf( "%.2f", strtod( $z ) );
> print "$t\n";
> }
>
Beide male 100,04 als Ergebnis in meinem Program.
Wenn ich eine neue Datei anlege, dann erhalte ich 100.04 und 100,04.
Hat das was damit zu tun, wenn ich das in einem Modul mache?
Gruß Markus
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 15:49:57 von Ingo Menger
Markus Hochholzer schrieb:
> Ingo Menger schrieb:
>
> > Das können wir Dir höchstwahrscheinlih sagen, wenn Du uns sagst, was
> > folgende Kommandos (bzw. deren Äquivalente auf Deinem OS) ausgeben:
> >
> > grep locale "deinskript.pl"
> > env | grep LC
> > echo $LANG
>
> Nun,
> $locale_values =3D localeconv();
> for (sort keys %$locale_values) {
> printf "%-20s =3D %s\n", $_, $locale_values->{$_}
> }
> liefert mir decimal_point =3D ,
Das ist keine Antwort auf meine Frage.
> Hab es jetzt schon mit setlocale(LC_ALL, "en_US"); versucht, aber ohne
> Erfolg.
Möglicherweise deshalb, weil "en_US" keine gültige Locale bei Dir ist
(nicht installiert?). Antwort sollte
locale -a
geben.
Was jedoch immer gehen sollte ist Locale "C" bzw. "POSIX"
> Aus perllocale - Perl locale handling: Formats are the only part
> of Perl that unconditionally use information from a program's locale; if
> a program's environment specifies an LC_NUMERIC locale, it is always
> used to specify the decimal point character in formatted output.
> Formatted output cannot be controlled by use locale because the pragma
> is tied to the block structure of the program, and, for historical
> reasons, formats exist outside that block structure.
Das spielt keine Rolle, da Du ja keine Formate benutzt, sondern nur
sprintf.
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 15:56:19 von Ingo Menger
Markus Hochholzer schrieb:
> Wenn ich eine neue Datei anlege, dann erhalte ich 100.04 und 100,04.
Ich nicht. Wenn ich eine neue Datei anlege, dann erhalte ich eine neue
Datei.
>
> Hat das was damit zu tun, wenn ich das in einem Modul mache?
>
Nein.
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 16:15:25 von Mirco Wahab
Markus Hochholzer wrote:
> Beide male 100,04 als Ergebnis in meinem Program.
> Wenn ich eine neue Datei anlege, dann erhalte ich 100.04 und 100,04.
>
> Hat das was damit zu tun, wenn ich das in einem Modul mache?
Das heist, dein Code steht bereits unter setlocale von
irgend wo anders her. versuch mal, wie Ingo es beschrieben
hat, eine gültige locale zu finden, z.B.:
{
my $z = '100.039777';;
my $t = sprintf( "%.2f", $z ); # .
print "$t\n";
}
{
use POSIX;
my $z = '100,039777'; # ,
setlocale(LC_ALL, "de_DE"); # . -> ,
my $n = strtod( $z ); # ,
printf( "%.2f\n", $n ); # ,
setlocale(LC_ALL, "C"); # , -> .
printf( "%.2f\n", $n ); # .
}
Viele Grüße
M.
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 19.01.2007 17:03:49 von Ingo Menger
Mirco Wahab schrieb:
> Markus Hochholzer wrote:
> > Beide male 100,04 als Ergebnis in meinem Program.
> > Wenn ich eine neue Datei anlege, dann erhalte ich 100.04 und 100,04.
> >
> > Hat das was damit zu tun, wenn ich das in einem Modul mache?
>
> Das heist, dein Code steht bereits unter setlocale von
> irgend wo anders her.
Das *kann* es heißen.
Hat aber mit Modulen an sich nichts zu tun.
Auch wenn die subroutine im selben Modul läge, könnte sie bei einem
Aufruf Kommas, bei einem anderen Punkte erzeugen, sofern sie nicht
selbst ihrerseits setlocale ausführt.
Denkbar wäre auch sowas
sub fehlerhaftedezimaltrenner {
setlocale(LC_NUMERIC, "C"); # make sure we get decimal
point!!!
sprintf "%.2f", somefuntion($_[0]);
}
Aller Code, der zwischen dem vermeintlich letzten setlocale und dem
tatsächlichen Aufruf von sprintf liegt, kann die locale wieder
umsetzen. Also insbesondere auch derjenige, der die Argumente für
sprintf berechnet.
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 20.01.2007 04:20:38 von Phil
Am Fri, 19 Jan 2007 11:02:41 +0100 schrieb Markus Hochholzer:
> Aber anstatt "100.00" wird immer "100,00" ausgegeben.
>
> Was muà ich einstellen, daà sprintf die "Finger" vom Dezimaltrennzeichen
> läÃt?
use POSIX qw(locale_h);
setlocale(LC_NUMERIC, 'POSIX');
Re: Warum wandelt sprintf Dezimalpunkte in Kommas?
am 20.01.2007 10:10:39 von Markus Hochholzer
Markus Hochholzer schrieb:
>
> Aber anstatt "100.00" wird immer "100,00" ausgegeben.
>
> Was muß ich einstellen, daß sprintf die "Finger" vom Dezimaltrennzeichen
> läßt?
Ich habe die Ursache gefunden.
Es liegt am "use Gtk2 -init;"
Wenn ich die Zeile auskommentiere, dann funktioniert alles wie gewünscht.