/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Locale på Win32 og dansk, sjov med tal
Fra : damjensen@gmail.com


Dato : 28-11-08 06:27

Jeg har haft brug for at behandle et Excelark som indeholder tal, både
negative og positive.

I den forbindelse har jeg haft noget frustration ud af decimaltal og
negative værdier. Jeg har opdaget noget
"underligt" som jeg vil høre om andre har set.

Først: Jeg bruger Win32, v5.10.0 built for MSWin32-x86-multi-thread

For at kunne bruge tal med komma er jeg nødt til at sætte locale. Men
jeg har fundet ud af at
1) unix-locales åbenbart ikke findes på Win32
2) dansk hedder "da" på Win32, dette er nærmest ikke dokumenteret
nogen steder
3) tilsyneladende fungerer dansk ikke på Perl, se nedenstående:

Kode
use strict;
use locale;
use POSIX;

POSIX::setlocale( &POSIX::LC_ALL, "da" );
my $number1 = "-123,44";
my $number2 = 10;
my $result = $number1 / $number2;
printf ('%4.4f', $result);


Dette resulterer i -12,3000 - altså IKKE det korrekte resultat.

Udskiftes "da" med den TYSKE variant ("ge" ??!!) fungerer det, og
resultatet bliver korrekt -12,3440.

Den danske locale smider simpelthen decimaldelen væk. Prøv selv at
indføre
printf ('%4.4f', $number1 * -1);


Hvad er det der går galt med dansk locale på Win32, og hvor er den
slags defineret / dokumenteret ?
Det er meget svært at finde noget som helst om emnet i Perl grupper.
Men det er nødvendigt fordi det er
et helvede at håndtere decimaltal med dot i beregninger og komma i
print.

Håber nogle kloge eksperter kan hjælpe.

Mvh Torben

 
 
rbk17 (29-11-2008)
Kommentar
Fra : rbk17


Dato : 29-11-08 00:12

On Fri, 28 Nov 2008 05:27:18 -0800, damjensen wrote:

> Jeg har haft brug for at behandle et Excelark som indeholder tal, både
> negative og positive.
>
> I den forbindelse har jeg haft noget frustration ud af decimaltal og
> negative værdier. Jeg har opdaget noget "underligt" som jeg vil høre om
> andre har set.
>
> Først: Jeg bruger Win32, v5.10.0 built for MSWin32-x86-multi-thread
>
> For at kunne bruge tal med komma er jeg nødt til at sætte locale. Men
> jeg har fundet ud af at
> 1) unix-locales åbenbart ikke findes på Win32 2) dansk hedder "da" på
> Win32, dette er nærmest ikke dokumenteret nogen steder
> 3) tilsyneladende fungerer dansk ikke på Perl, se nedenstående:
>
>
Kode
> use strict;
> use locale;
> use POSIX;
>
> POSIX::setlocale( &POSIX::LC_ALL, "da" ); my $number1 = "-123,44";
> my $number2 = 10;
> my $result = $number1 / $number2;
> printf ('%4.4f', $result);
>

>
> Dette resulterer i -12,3000 - altså IKKE det korrekte resultat.
>
> Udskiftes "da" med den TYSKE variant ("ge" ??!!) fungerer det, og
> resultatet bliver korrekt -12,3440.
>
> Den danske locale smider simpelthen decimaldelen væk. Prøv selv at
> indføre
> printf ('%4.4f', $number1 * -1);
>
>
> Hvad er det der går galt med dansk locale på Win32, og hvor er den slags
> defineret / dokumenteret ?
> Det er meget svært at finde noget som helst om emnet i Perl grupper. Men
> det er nødvendigt fordi det er
> et helvede at håndtere decimaltal med dot i beregninger og komma i
> print.
>
> Håber nogle kloge eksperter kan hjælpe.
>
> Mvh Torben

Hej Torben -

Nu er det måske ikke helt det du vil, men hvad med bare at springe over
hvor gæret et lavest:

my $number1 = "-123,44";
$number1 =~ s/,/./;

( $Nummer har du jo nok alligevel indlæst som tekst, tidligerer. Du
kommer jo til at "konverete" til tal alligevel... $number1+=0;)

Ok, det hjælper jo ikke på din printf...
- Og det var heller ikke det du spurgte om.


/holger


damjensen@gmail.com (30-11-2008)
Kommentar
Fra : damjensen@gmail.com


Dato : 30-11-08 15:55

> Nu er det måske ikke helt det du vil, men hvad med bare at springe over
> hvor gæret et lavest:


Det var også det jeg gjorde først, men det er vældigt træls hele tiden
at holde styr på hvornår strengen er i punktum og komma-format,
afhængig
af om det er til beregning og print. Tallene er både positive og
negative, og kan have 0 til 2 decimaler.
Derfor ville jeg gerne kunne beregne "clean". Og det funger også nu,
med locale til tysk.

Men jeg er utroligt nysgerrig efter at vide HVORFOR #/¤/#/&¤"#&#/ det
er sådan. Jeg kan intet finde på nettet om locales til winperl, og er
ellers
pænt skrap til google & co. Der er ingen svar i den engelske gruppe.


> my $number1 = "-123,44";
> $number1 =~ s/,/./;

Hmm skulle det så ikke være =~ s/,/\./; - altså med punktum escaped ?
Den model virker i hvert fald.


Peter Makholm (01-12-2008)
Kommentar
Fra : Peter Makholm


Dato : 01-12-08 06:07

damjensen@gmail.com writes:

>> $number1 =~ s/,/./;
>
> Hmm skulle det så ikke være =~ s/,/\./; - altså med punktum escaped ?

Punktum har ingen specie betydning i tekststrenge, og højresiden af en
substution er en almindelig tekststreng (undtagen hvis man bruger
/e). Det er kun i regulære udtryk at punktum er speciel.

//Makholm

Søg
Reklame
Statistik
Spørgsmål : 177414
Tips : 31962
Nyheder : 719565
Indlæg : 6407849
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste