Bonjour,
J'avais écrit un
andromede/ = 10 Mars, 2006 - 17:34
Bonjour,
J'avais écrit un script Perl qui faisait ça, je viens de le passer en fonction. Il y a quelques restrictions mais ça fonctionne plutôt bien.
A adapter, je suis ouvert à toute amélioration.
-- Function: n2l(float8)
-- DROP FUNCTION n2l(float8);
CREATE OR REPLACE FUNCTION n2l(float8)
RETURNS text AS
$BODY$
my @units = qw/zéro un deux trois quatre cinq six sept huit neuf dix onze douze treize quatorze quinze seize dix-sept dix-huit dix-neuf/;
my @diz = qw/zéro dix vingt trente quarante cinquante soixante soixante-dix quatre-vingt quatre-vingt-dix/;
my @mult1 = qw/unité dix cent/;
my @mult2 = qw/unité mille million milliard billion billiard/;
my @deci1 = qw/unité dixième centième millième/;
my @deci2 = qw/unité millième millionnième milliardième billionnième billiardième/;
my $nombre = $_;
$nombre =~ s/\s//g;
$nombre =~ s/[^0-9.,+-]//g;
my $lit = '';
my @lit = ();
my ($ent,$dec) = split/[.,]/,$nombre;
$dec = '' if($dec == 0);
if($nombre < 0) {
$ent = abs($ent);
$lit = "moins ";
}
if($ent < 20) {
$lit .= $units[$ent];
} else {
$lit .= join' ',reverse &getlit($ent);
}
if($dec ne '') {
my $lgdec = length($dec);
$dec =~ s/^0*//;
$lit .= " et " . join' ',reverse(&getlit($dec));
if($lgdec < 4) {
$lit .= $deci1[$lgdec];
} else {
$lit .= ($lgdec%3 == 0 ? "" : $mult1[($lgdec%3)] . "-") . $deci2[int($lgdec/3)];
}
$lit .= $dec > 1 ? "s" : "";
}
return $lit;
sub getlit {
my $ent = shift;
my @ent = split //, $ent;
my $num = scalar @ent;
my $m = 0;
my @lit;
for(my $i=@ent-1;$i>=0;$i-=3) {
my $u = $ent[$i];
my $d = $i > 0 ? $ent[$i-1] : '';
my $c = $i > 1 ? $ent[$i-2] : "";
my $g = $c . $d . $u;
my $temp = '';
if($c > 1) {
$temp = $units[$c] . " " . $mult1[2] . ($u+$d == 0 ? "s " : " ");
} elsif($c == 1) {
$temp = $mult1[2] . " ";
}
if($d == 1) {
$temp .= $units[$d*10+$u] . " ";
} elsif($d == 7) {
if($u == 0) {
$temp .= $diz[$d] . " ";
} else {
$temp .= $diz[$d-1] . ($u == 1 ? "-et-" . $units[$u+10] : "-" . $units[$u+10]) . " ";
}
} elsif($d == 8) {
$temp .= $diz[$d] . ($u != 0 ? "-" . $units[$u] : 's ') . " ";
} elsif($d == 9) {
if($u == 0) {
$temp .= $diz[$d] . " ";
} else {
$temp .= $diz[$d-1] . "-" . $units[$u+10] . " ";
}
} elsif($d != 0) {
$temp .= $diz[$d] . ($u == 0 ? " " : $u == 1 ? "-et-" . $units[$u] : "-" . $units[$u]) . " ";
} elsif($u != 0) {
$temp .= $units[$u] . " ";
}
if($m == 0) {
$lit[$m] = $temp;
} elsif($m == 1) {
$lit[$m] = $g == 1 ? $mult2[$m] : $temp . $mult2[$m];
} else {
$lit[$m] = $temp . $mult2[$m];
}
$lit[$m] .= 's' if($g > 1 and $m > 1);
$m++;
}
return @lit;
}
$BODY$
LANGUAGE 'plperl' VOLATILE;
ALTER FUNCTION n2l(float8) OWNER TO postgres;
[ Vous devez
vous connecter pour poster des commentaires ]
Bonjour... je tiens à te rem
jarod_ab/ = 12 Mars, 2006 - 10:55
Bonjour... je tiens à te remercier pour la réponse. j'ai éssayé de créer cette fonction mais il me dit que le "language "plperl" does not exist", donc comment je dois faire pour ajouter le langage plperl. merci d'avance!
[ Vous devez
vous connecter pour poster des commentaires ]