PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

conversion d'un nombre en lettre

Technique - général | conversion d'un nombre en lettre

Par jarod_ab le 08/03/2006 - 16:26

bonjour,
existe t-il une fonction sous postgres qui convertie un nombre en lettre.
exemple: 12 --> douze ,
12,10 --> douze virgule dix
etc...
merci

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

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;


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!


Bonjour,

andromede/ = 12 Mars, 2006 - 11:58

Bonjour,

Il suffit d'exécuter la commande
CREATE LANGUAGE plperl;

Voir : http://docs.postgresqlfr.org/pg-8.1.2/xplang.html


Bonjour. ce n'est pas de mes

jarod_ab/ = 9 Avril, 2006 - 11:25

Bonjour. ce n'est pas de mes habitudes de ne pas remercier les gens. j'ai lu votre réponse mais je n'avais pas j'ai été très très occupé (je travaille sur bcq de choses), donc merci bcq et excuse moi pour ce retard...


Bonjour, J'ai testé la fo

SAS/ = 13 Avril, 2006 - 13:39

Bonjour,

J'ai testé la fonction, mais malheureusement, je ne récupère qu'invariablement 'zéro'.
Aurais-je omis qqch ?

Stéphane Schildknecht


Bonjour, Désolé pour le

andromede/ = 24 Avril, 2006 - 12:30

Bonjour,

Désolé pour le retard.
Comment testes-tu la fonction ?
Version de PostgreSQL, OS ?

J'ai testé sous windows avec la 8.1.3 et linux avec la 7.4.x, ça fonctionne sans problème.

Olivier.


Bonjour, Sous linux, debi

SAS/ = 25 Avril, 2006 - 16:58

Bonjour,

Sous linux, debian testing, PG 8.1.

k2_test=> select n2l(87);
n2l
-------
zéro
(1 ligne)

Stéphane Schildknecht


Bonsoir, Je dois dire que

andromede/ = 27 Avril, 2006 - 18:31

Bonsoir,

Je dois dire que là je suis un peu sec :-(
Ça fonctionne nickel aussi bien chez moi que sur mon serveur.

Peut-être la version de Perl, respectivement 5.8.7 et 5.8.5
As-tu bien tout copié tel que ?

Quelqu'un d'autre du forum a-t-il testé ?

Olivier.


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.