montant en lettre

91 views
Skip to first unread message

filon

unread,
Mar 31, 2003, 8:58:57 AM3/31/03
to
Bonjour,

Jutilise actuellement cette fonction de access pour convertir un montant en
chiffre en lettre, et j'ai besoin de faire la meme chose en php, j'ai
chercher pour voir si cela exister en php , mais je n'ai rien trouver, ne
m'y connaissant pas assez en php (je débute mais j'ai quand meme essayé),
j'aimerai trouver une ame charitable qui pourrait adapter ce programme, si
cela est possible, de VBA en PHP.

Merci

Public Function MontantLettre(Montant As Currency, Optional Monnaie As
String, Optional Centime As String) As String


Dim t1(20) As String
Dim t2(9) As String
Dim t3(6) As String

Dim i As Integer
Dim i_max As Integer
Dim i_min As Integer
Dim m As String 'Montant numérique sous forme de chaîne
formatée "000"
Dim r As Integer 'Reste de la longueur à cobler pour avoir un
format "000"
Dim p As String 'Partie au format "000"
Dim p1 As Integer ' partie untié de P
Dim p2 As Integer ' partie dizaine de P
Dim p3 As Integer ' partie centaine de P
Dim w As String 'Montant en lettre de P
Dim x As String 'Montant en lettre final

t1(0) = ""
t1(1) = "un"
t1(2) = "deux"
t1(3) = "trois"
t1(4) = "quatre"
t1(5) = "cinq"
t1(6) = "six"
t1(7) = "sept"
t1(8) = "huit"
t1(9) = "neuf"
t1(10) = "dix"
t1(11) = "onze"
t1(12) = "douze"
t1(13) = "treize"
t1(14) = "quatorze"
t1(15) = "quinze"
t1(16) = "seize"
t1(17) = "dix-sept"
t1(18) = "dix-huit"
t1(19) = "dix-neuf"
t1(20) = "vingt"

t2(0) = ""
t2(1) = ""
t2(2) = "vingt"
t2(3) = "trente"
t2(4) = "quarante"
t2(5) = "cinquante"
t2(6) = "soixante"
t2(7) = "soixante"
t2(8) = "quatre-vingt"
t2(9) = "quatre-vingt"

If Monnaie = "" Then
Centime = ""
Else
If Montant >= 2 Then
Monnaie = Monnaie & "s"
End If
If Centime <> "" Then
If ((Montant - Fix(Montant)) * 100) >= 2 Then
Centime = Centime & "s"
End If
If ((Montant - Fix(Montant)) * 100) > 0 Then
Monnaie = Monnaie & " et"
End If
End If
End If

t3(0) = Centime
t3(1) = Monnaie
t3(2) = "mille"
t3(3) = "million"
t3(4) = "milliard"
t3(5) = "billiard"
t3(6) = "triard"

'Mise en forme en chaîne
m = Format$(Montant, "000.00")
r = Len(m) Mod 3
If r > 0 Then
m = Left$("000", 3 - r) & m
End If
i_max = (Len(m) / 3) - 1
i_min = IIf(Centime = "", 1, 0)

x = ""
For i = i_min To i_max

p = Mid$(m, Len(m) - (3 * i) - 2, 3)
p1 = Val(Mid$(p, 3, 1))
p2 = Val(Mid$(p, 2, 1))
p3 = Val(Mid$(p, 1, 1))

'centaines
Select Case p3
Case 0
w = ""
Case 1
w = "cent"
Case Else
w = t1(p3) & IIf((p1 = 0) And (p2 = 0), " cents", " cent")
End Select

'dizaines
Select Case p2
Case 0, 1
'de 0 à 19
w = w & " " & t1(p1 + 10 * p2)
Case 7, 9
'on passe aux valeur qui dépasssent 10
w = w & " " & t2(p2) & IIf((p1 = 1) And (p2 < 8), " et ", "-") &
t1(p1 + 10)
Case Else
If (i <= 1) And (p2 = 8) And (p1 = 0) Then
'Cas ou le montant se termine par "Quatre-vingts" tout rond
w = w & " " & t2(8) & "s"
Else
w = w & " " & t2(p2) & IIf((p1 = 1) And (p2 < 8), " et ",
IIf(p1 = 0, "", "-")) & t1(p1)
End If
End Select

w = Trim$(w)

'On affiche "zéro" si la somme fait "zéro euro"
If (i > 0) And (Montant < 1) Then
w = "zéro"
End If


If (w <> "") Or ((i = 1) And (i_max > 1)) Then
If (i = 2) And (p = "001") Then
'On évite le "un" s'il s'agit d'1 millier d'euro (exemple
: "mille deux cents", et non pas "un mille deux cent")
x = t3(i) & " " & x
Else
'dans le cas classique, on colle la somme
x = w & " " & t3(i) & " " & x
End If
End If

x = Trim$(x)

Next i

MontantLettre = UCase$(Left$(x, 1)) & Mid$(x, 2)

End Function

Olivier Miakinen

unread,
Mar 31, 2003, 10:40:44 AM3/31/03
to
Le 31/03/2003 15:58, filon a écrit :
> Bonjour,
>
> Jutilise actuellement cette fonction de access pour convertir un montant en
> chiffre en lettre, et j'ai besoin de faire la meme chose en php

C'est amusant comme idée. Je vais essayer de m'y mettre.

> [...]


> t2(6) = "soixante"
> t2(7) = "soixante"
> t2(8) = "quatre-vingt"
> t2(9) = "quatre-vingt"
>

> [...]


> Case 7, 9
> 'on passe aux valeur qui dépasssent 10
> w = w & " " & t2(p2) & IIf((p1 = 1) And (p2 < 8), " et ", "-") & t1(p1 + 10)

J'essaye de faire une version mutli-francophone, avec choix des options
"septante", "octante" et "nonante" ? (si oui, j'ai besoin de connaître
les règles précises, car je crois que par exemple certains emploient
septante et nonante mais pas octante).

Olivier Miakinen

unread,
Mar 31, 2003, 10:40:44 AM3/31/03
to
Le 31/03/2003 15:58, filon a écrit :

> t3(2) = "mille"
> t3(3) = "million"
> t3(4) = "milliard"

Ok.

> t3(5) = "billiard"

Ce mot n'existe pas. Le terme correct est "billion".

> t3(6) = "triard"

Ça, "triard", cela vaut son pesant de cacahuettes !

De toutes les façons, en français il n'existe pas de terme spécifique
pour les milliers de billions. Ensuite on a les trillions, les milliers
de trillions, etc. jusqu'aux sextillions (10^36). Cela dit, les entiers
sur 32 bits ne peuvent aller beaucoup plus loin que 4 milliards, tandis
que ceux sur 64 bits dépassent de peu 18 trillions.

Par ailleurs, filon, j'ai deux questions sur la fonction actuelle :
1) Quel est le type de base d'un "Currency" : Integer ou String ?
2) Comment la fonction écrit-elle 3000 et 3000000 : trois mille ou trois
milles ? trois million ou trois millions ?

Judicael

unread,
Mar 31, 2003, 10:40:44 AM3/31/03
to
> j'ai chercher pour voir si cela exister en php , mais je n'ai rien
trouver,

pas assez apparement , j'ai trouvé en 4 clics et 30 secondes

http://listes.rezo.net/archives/spip-dev/2000-05/msg00038.html

P'tit Marcel

unread,
Mar 31, 2003, 10:40:44 AM3/31/03
to
filon écrivit:

> Jutilise actuellement cette fonction de access pour convertir un
> montant en chiffre en lettre, et j'ai besoin de faire la meme chose en
> php,

J'ai une fonction php qui sert à ça. Il suffit de l'appeler par un :
nombre_en_lettres(le nombre en chiffres)

Attention elle utilise le français de France donc pas de septante ou de
nonante.


# donne un nombre entier en lettres
('rang' sert en mode récursif à indiquer 'mille' 'million' 'milliard')
function nombre_en_lettres($nombre,$rang=0) {
$chiffre_unite=array
("","un","deux","trois","quatre","cinq","six","sept","huit","neuf");
$chiffre_dizaine_unite=array
("dix","onze","douze","treize","quatorze","quinze","seize","dix-sept","dix-
huit","dix-neuf");
$chiffre_dizaine=array("","dix","vingt","trente","quarante","cinquante","so
ixante","soixante","quatre-vingt","quatre-vingt");
$prefixe_milliers=array(1=>"mille","million","milliard","billion","billiard
");

if ($nombre<0) $nombre=-$nombre; # valeur positive
if ($nombre>2147483647) return $nombre; # borne supérieure des integer
$nombre=(double)floor($nombre); # valeur entière
if ($nombre==0) return "zéro";

$unite=$nombre % 10 ; #chiffre des unités
$i=($nombre-$unite)/10;
$dizaine=$i % 10 ; #chiffre des dizaines
$i=($i-$dizaine)/10;
$centaine=$i % 10 ; # chiffres des centaines
$milliers=($i-$centaine)/10;
$retour_avant="";

# appel récursif pour traiter les mille, millions, etc.
if ($milliers>0) {
if ($rang<5)
$retour_avant=nombre_en_lettres($milliers,$rang+1)." ";
else
$retour_avant=$milliers."E+18 " ; # en chiffres si nombre grand
}

$retour="";
# traitement du chiffre des centaines
if ($centaine>0) {
if ($centaine==1) $retour = "cent " ;
else {
$retour = $chiffre_unite[$centaine]." cent";
if (($dizaine+$unite)==0)
$retour.="s ";
else $retour.=" "; # pas de 's' à cent dans 'deux cent dix'
}
}
# traitement du chiffre des dizaines et des unités
switch($dizaine) {
case (0):
if (($unite==1) and ($rang==1) and ($centaine==0)){
if ($milliers>0) $retour .= "et "; # cas de 1001000
break; # on ne dit pas "un mille"
}
# cas normal : 0...9
$retour .= $chiffre_unite[$unite];
break;
case (1): # cas 10 .. 19
$retour .= $chiffre_dizaine_unite[$unite];
break;
case (7) : # cas 70 .. 79
if ($unite==1) $lien="-et-"; # "soixante-et-onze"
if ($unite>1) $lien="-";
$retour .= $chiffre_dizaine[$dizaine].$lien.
$chiffre_dizaine_unite[$unite];
break;
case (8) : # cas 80 .. 89
if ($unite>0) $lien="-";
else $lien=" ";
$retour .= $chiffre_dizaine[$dizaine].$lien.
$chiffre_unite[$unite];
break;
case (9) : # cas 90 .. 99
if ($unite>0) $lien="-";
else $lien=" ";
$retour .= $chiffre_dizaine[$dizaine].$lien.
$chiffre_dizaine_unite[$unite];
break;
default: # cas 20 .. 69
if ($unite==1) $lien=" et ";
else $lien=" ";
$retour .= $chiffre_dizaine[$dizaine].$lien.
$chiffre_unite[$unite];
}

# on ajoute mille, million(s), milliard(s)... si besoin
if (($retour!="") and ($rang>0)) {
$retour .= " ".$prefixe_milliers[$rang];
if(($rang>1) and ($nombre>1)) $retour="s"; # pas de 's' à mille
$retour.=" ";
}
elseif (($unite==1) and ($rang==1))
$retour =$prefixe_milliers[$rang] ; # cas de 'mille' (1000)

# on concatène avec les chiffres de l'appel récursif supérieur
$retour=$retour_avant.$retour;

# on evacue les double espaces éventuels
$retour=str_replace(" "," ",$retour);

return $retour;

} # de function nombre_en_lettres

Merci de me signaler s'il y a des erreurs (notamment de grammaire ;-)

eça
--
P'tit Marcel
statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/

Jay Tropeur

unread,
Mar 31, 2003, 12:59:32 PM3/31/03
to
Olivier Miakinen a écrit:

> Le 31/03/2003 15:58, filon a écrit :
>
>> Bonjour,
> [...]

> J'essaye de faire une version mutli-francophone, avec choix des options
> "septante", "octante" et "nonante" ? (si oui, j'ai besoin de connaître
> les règles précises, car je crois que par exemple certains emploient
> septante et nonante mais pas octante).

En Belgique, tu n'as que septante et nonante, mais d'après le net,
en Suisse, suivant les cantons tu as même:
«Septante, octante, huitante et nonante»

Voir:
http://www.langue-fr.net/index/S/septante.htm

--
Jay Tropeur

Un jour ou l'autre,
Il y a des types qui mangeront du fromage.

filon

unread,
Mar 31, 2003, 3:24:48 PM3/31/03
to
Merci pour vos réponses,

Ma question avait 2 intérets pour moi, le primer, avoir une fonction qui
fasse la conversion aussi simplement que la fonction que j'utilise dans
Access (j'avais trouve de sfoncions sur le net, mais trop complique pour moi
à utiliser).

Je remercie Petit Marcel pour sa fonction, que je vais essyaer desuite :)


2e interet
Voir si il est facile de convertir un prg realise en VBA vers PHP, car, je
suis en train de porter un appli Access vers PHP/Mysql, et dans cette appli,
jutile quelques fonctions maison.

Donc, j'ai besoin de votre avis la dessus, c'est a dire, est facile de faire
cette conversion. Est-ce que ces quex langage sont proche au niveau syntaxe
(je suis en train de rechercher les correspondance de fonction VBA/PHP).

Merci

filon

unread,
Mar 31, 2003, 3:24:48 PM3/31/03
to
> Par ailleurs, filon, j'ai deux questions sur la fonction actuelle :
> 1) Quel est le type de base d'un "Currency" : Integer ou String ?

Je te donnes la definition de l'aide de vba

Les variable de type Currency sont stockées sous la forme de nombres de 64
bits (8 octets) au format entier, avec un décalage de 10 000 afin d'obtenir
un nombre à virgule fixe comprenant 15 chiffres à gauche du séparateur
décimal et 4 chiffres à droite. Cette représentation offre une plage
comprise entre -922 337 203 685 477,5808 et 922 337 203 685 477,5807


> 2) Comment la fonction écrit-elle 3000 et 3000000 : trois mille ou trois
> milles ? trois million ou trois millions ?

3000 devient : Trois mille
3000000 devient : trois million

Filon

P'tit Marcel

unread,
Mar 31, 2003, 3:24:48 PM3/31/03
to
Jay Tropeur écrivit:

> Olivier Miakinen a écrit:
>> Le 31/03/2003 15:58, filon a écrit :
>>
>>> Bonjour,
> > [...]
>> J'essaye de faire une version mutli-francophone, avec choix des options
>> "septante", "octante" et "nonante" ? (si oui, j'ai besoin de connaître
>> les règles précises, car je crois que par exemple certains emploient
>> septante et nonante mais pas octante).
>
> En Belgique, tu n'as que septante et nonante, mais d'après le net,
> en Suisse, suivant les cantons tu as même:
> «Septante, octante, huitante et nonante»

Oui, pas con de localiser pour les belges et les suisses. Je rectifie

# donne un nombre entier en lettres

# option : pays (fr,be,ch) permet de gérer les formes locales de 70 80 90)
# (nb: le paramètre rang est à usage interne, pour appel récursif)
function nombre_en_lettres($nombre,$pays='fr',$rang=0) {

static $chiffre_unite=


array ("","un","deux","trois","quatre","cinq","six","sept","huit","neuf");

static $chiffre_dizaine_unite=


array ("dix","onze","douze","treize","quatorze","quinze","seize","dix-
sept","dix-huit","dix-neuf");

static $chiffre_dizaine=
array("","dix","vingt","trente","quarante","cinquante","soixante","soixante


","quatre-vingt","quatre-vingt");

static $chiffre_dizaine_be_ch=
array(7=>"septante","huitante","nonante");
static $prefixe_milliers=
array("","mille","million","milliard","billion","billiard");


if ($nombre<0) $nombre=-$nombre; # valeur positive

if ($nombre>2147483647) return $nombre; # borne supérieure des integer...


$nombre=(double)floor($nombre); # valeur entière
if ($nombre==0) return "zéro";

if(($pays<>'ch') and ($pays<>'be') and ($pays<>'fr')) $pays='fr';

$unite=$nombre % 10 ; #chiffre des unités
$i=($nombre-$unite)/10;
$dizaine=$i % 10 ; #chiffre des dizaines
$i=($i-$dizaine)/10;
$centaine=$i % 10 ; # chiffres des centaines
$milliers=($i-$centaine)/10;

$retour_avant=$retour="";

# appel récursif pour les milliers, millions, etc.


if ($milliers>0) {
if ($rang<5)

$retour_avant=nombre_en_lettres($milliers,$pays,$rang+1)." ";
else $retour_avant=$milliers."E+18 " ; # en chiffres si nb trop grand


}
# traitement du chiffre des centaines
if ($centaine>0) {
if ($centaine==1) $retour = "cent " ;
else {
$retour = $chiffre_unite[$centaine]." cent";
if (($dizaine+$unite)==0) $retour.="s ";
else $retour.=" "; # pas de 's' à cent dans 'deux cent dix'
}
}
# traitement du chiffre des dizaines et des unités

if ($unite>0) $lien="-";
else $lien="";

switch($dizaine) {
case 0:
if (($unite==1) and ($rang==1) and ($centaine==0)){ # cas "un mille"


if ($milliers>0) $retour .= "et "; # cas de 1001000
break;
}

# 00 .. 09


$retour .= $chiffre_unite[$unite];
break;

case 1: # 10 .. 19


$retour .= $chiffre_dizaine_unite[$unite];
break;

case 8 : # 80 .. 89
if($pays<>'ch') {
$retour .= $chiffre_dizaine[$dizaine].$lien.$chiffre_unite[$unite];
if($unite==0) $retour .='s';
break;
}
case 7 : # 70 .. 79
case 9 : # 90 .. 99
if($pays=='fr') {
$retour .= $chiffre_dizaine[$dizaine].'-'.
$chiffre_dizaine_unite[$unite];
break;
}
default: # 20 .. 69 (ou 70..99 hors de France)
if ($unite==1) $lien=" et ";
if($dizaine<7) $retour .=$chiffre_dizaine[$dizaine];
else $retour .=$chiffre_dizaine_be_ch[$dizaine];
$retour .=$lien.$chiffre_unite[$unite];
}
# on ajoute mille, million si besoin


if (($retour!="") and ($rang>0))

$retour .= " ".$prefixe_milliers[$rang].
((($rang>1) and ($nombre>1)) ? "s " : " "); # pas de 's' à mille


elseif (($unite==1) and ($rang==1))
$retour =$prefixe_milliers[$rang] ; # cas de 'mille' (1000)

# on concatène avec les chiffres de l'appel supérieur


$retour=$retour_avant.$retour;
# on evacue les double espaces éventuels
$retour=str_replace(" "," ",$retour);

return $retour;
}


newlabzone

unread,
Mar 31, 2003, 4:15:21 PM3/31/03
to
Notre aimable correspondant filon <filon...@wanadoo.fr>
se servit de son périphérique d'entrée préféré pour déclarer
:


> Bonjour,
>
> Jutilise actuellement cette fonction de access pour
> convertir un montant en chiffre en lettre, et j'ai besoin
> de faire la meme chose en php,

Tiens, l'autre jour je suis tombé sur ce script qui a l'air
assez complet

www.newlabzone.com/test/chif2let.txt


--
Sans la liberté de ramer, il n'est pas d'éloge flotteur.
www.newlabzone.com/

JCL

unread,
Mar 31, 2003, 7:31:52 PM3/31/03
to
En Belgique on n'utilise septante et nonante mais pas octante ni huitante.
En Suisse, ils sont logique jusqu'au bout, ils utilisent septante, octante,
nonante. J'ai entendu certains suisses utiliser huitante au lieu d'octante.
En France je pense que tu connais ;)

Pour les autres pays francophone je ne connais pas du tout.

JCL

newlabzone

unread,
Mar 31, 2003, 9:59:13 PM3/31/03
to
Notre aimable étourdi newlabzone <newla...@online.fr> se

servit de son périphérique d'entrée préféré pour déclarer :

> Tiens, l'autre jour je suis tombé sur ce script qui a


> l'air assez complet
>
> www.newlabzone.com/test/chif2let.txt

Zut, certain auront rectifiés d'eux-mêmes, mais pour que le
script soit clair, il faut afficher la source.

Désolé de pas avoir prévu qu'il s'afficherai comme ça ;)

filon

unread,
Apr 1, 2003, 6:27:44 AM4/1/03
to
Salut,
c'est parfait !!

Merci

Olivier Miakinen

unread,
Apr 1, 2003, 7:15:29 AM4/1/03
to
Le 01/04/2003 04:59, newlabzone a écrit :
>>
>> www.newlabzone.com/test/chif2let.txt
>
> Zut, certain auront rectifiés d'eux-mêmes, mais pour que le
> script soit clair, il faut afficher la source.
>
> Désolé de pas avoir prévu qu'il s'afficherai comme ça ;)

Chez moi (Netscape 7.02) il affiche le code source. Si ce n'est pas le
cas chez toi, c'est probablement dû à un bug dans l'un de nos deux
navigateurs. Je sais que Internet Explorer est bugué dans le sens où il
privilégie le nom par rapport au type mime envoyé, mais justement dans
ce cas (.txt) il devrait afficher le code source sans tenter de
l'interprêter.

Olivier Miakinen

unread,
Apr 1, 2003, 7:26:39 AM4/1/03
to
Le 31/03/2003 17:40, P'tit Marcel a écrit :
>
> J'ai une fonction php qui sert à ça. Il suffit de l'appeler par un :
> nombre_en_lettres(le nombre en chiffres)

J'ai trouvé quelques erreurs dans ton script.

> # donne un nombre entier en lettres

> [...]


>
> # appel récursif pour traiter les mille, millions, etc.

> [...]


> # traitement du chiffre des centaines

> [...]


> # traitement du chiffre des dizaines et des unités
> switch($dizaine) {
> case (0):
> if (($unite==1) and ($rang==1) and ($centaine==0)){
> if ($milliers>0) $retour .= "et "; # cas de 1001000

Bien que le "et" soit possible ici, il n'est pas nécessaire. De la même
manière, 1001 peut s'écrire "mille un" ou "mille et un".

> break; # on ne dit pas "un mille"
> }
> # cas normal : 0...9
> $retour .= $chiffre_unite[$unite];
> break;
> case (1): # cas 10 .. 19
> $retour .= $chiffre_dizaine_unite[$unite];
> break;
> case (7) : # cas 70 .. 79
> if ($unite==1) $lien="-et-"; # "soixante-et-onze"

$lien = " et "; # soixante et onze

> if ($unite>1) $lien="-";

remplacer "if ($unite > 1)" par "else"
(soixante-dix et pas soixantedix)

> $retour .= $chiffre_dizaine[$dizaine].$lien.
> $chiffre_dizaine_unite[$unite];
> break;
> case (8) : # cas 80 .. 89
> if ($unite>0) $lien="-";
> else $lien=" ";

$lien = "s ";
(quatre-vingts, quatre-vingt-un, etc.)


> $retour .= $chiffre_dizaine[$dizaine].$lien.
> $chiffre_unite[$unite];
> break;
> case (9) : # cas 90 .. 99
> if ($unite>0) $lien="-";
> else $lien=" ";

Remplacer les deux lignes précédentes par $lien = "-";
(quatre-vingt-dix et pas quatre-vingt dix)

> $retour .= $chiffre_dizaine[$dizaine].$lien.
> $chiffre_dizaine_unite[$unite];
> break;
> default: # cas 20 .. 69
> if ($unite==1) $lien=" et ";
> else $lien=" ";

else if ($unite > 0) $lien = "-";
else $lien = " ";

(vingt-deux et pas vingt deux)

> $retour .= $chiffre_dizaine[$dizaine].$lien.
> $chiffre_unite[$unite];
> }
>
> # on ajoute mille, million(s), milliard(s)... si besoin
> if (($retour!="") and ($rang>0)) {
> $retour .= " ".$prefixe_milliers[$rang];
> if(($rang>1) and ($nombre>1)) $retour="s"; # pas de 's' à mille

$retour .= "s"; # IMPORTANT

> $retour.=" ";
> }
> elseif (($unite==1) and ($rang==1))
> $retour =$prefixe_milliers[$rang] ; # cas de 'mille' (1000)
>
> # on concatène avec les chiffres de l'appel récursif supérieur
> $retour=$retour_avant.$retour;
>
> # on evacue les double espaces éventuels
> $retour=str_replace(" "," ",$retour);
>
> return $retour;
>
> } # de function nombre_en_lettres
>
>
>
> Merci de me signaler s'il y a des erreurs (notamment de grammaire ;-)

Il y en a d'autres, plus complexes à corriger. Par exemple, bien que ton
script écrive correctement "deux cents" et "deux cent dix", je crois
qu'il écrit incorrectement "deux cents mille" au lieu de "deux cent mille".

D'après ce que j'ai vu, le script qui semble avoir le moins d'erreurs
est celui de ARNO* dont le lien a été donné par Judicael :

http://listes.rezo.net/archives/spip-dev/2000-05/msg00038.html

Je crois quand même qu'il contient au moins un bug : oubli du "s" à
"millions" lorsque le nombre qui précède est "dix" ou "cent". Et puis
ARNO* ne semblait pas connaître l'instruction switch qui pourtant
simplifierait pas mal son code.

Olivier Miakinen

unread,
Apr 1, 2003, 7:26:39 AM4/1/03
to
Le 31/03/2003 22:24, filon a écrit :
>
> Les variable de type Currency sont stockées sous la forme de nombres de 64
> bits (8 octets) au format entier, avec un décalage de 10 000 afin d'obtenir
> un nombre à virgule fixe comprenant 15 chiffres à gauche du séparateur
> décimal et 4 chiffres à droite. Cette représentation offre une plage
> comprise entre -922 337 203 685 477,5808 et 922 337 203 685 477,5807

L'entier le plus grand vaut donc neuf cent vingt-deux billions trois
cent trente-sept milliards deux cent trois millions six cent
qautre-vingt-cinq mille quatre cent soixante-dix-sept.

Mais php permettant de mélanger les entiers et les chaînes, on peut
envisager un programme qui fonctionne avec des entiers, mais en même
temps qui aille jusqu'aux sextillions avec les chaînes.

>> 2) Comment la fonction écrit-elle 3000 et 3000000 : trois mille ou trois
>> milles ? trois million ou trois millions ?
>
> 3000 devient : Trois mille
> 3000000 devient : trois million

Il me semblait bien qu'il devait y avoir un bug ici. Cela devrait être
trois millions avec un s.

Olivier Miakinen

unread,
Apr 1, 2003, 7:26:39 AM4/1/03
to
Le 31/03/2003 22:24, filon a écrit :
>
> 2e interet
> Voir si il est facile de convertir un prg realise en VBA vers PHP, car, je
> suis en train de porter un appli Access vers PHP/Mysql, et dans cette appli,
> jutile quelques fonctions maison.
>
> Donc, j'ai besoin de votre avis la dessus, c'est a dire, est facile de faire
> cette conversion. Est-ce que ces quex langage sont proche au niveau syntaxe
> (je suis en train de rechercher les correspondance de fonction VBA/PHP).

Je ne connaissais pas VBA, mais l'adaptation me semble relativement
simple. En gros, il faut :
- ajouter des ; à chaque instruction
- mettre des { } à chaque bloc d'instructions
- mettre $ devant chaque nom de variable
- supprimer les déclarations de types et de dimensions (tableaux)
- remplacer () par [] pour les tableaux
- remplacer & par . pour la concaténation de chaînes
- remplacer IIf(test,valeur1,valeur2) par (test ? valeur1 : valeur 2)
- remplacer Select Case par switch() et Case Else par default:
- remplacer ' par # ou // ou /* */ pour les commentaires

Bon, il y a des trucs à modifier partout, mais chaque élément de langage
que je vois en VBA a son équivalent en PHP.

P'tit Marcel

unread,
Apr 1, 2003, 3:30:53 PM4/1/03
to
Version corrigée du script en fonction des remarques d'Olivier:


# donne un nombre entier en lettres

# (pays (fr, be, ch) permet de gérer les formes locales de 70 80 90)
# (rang sert en mode récursif à indiquer 'mille' 'million' 'milliard')
function nombre_en_lettres($nombre,$pays='fr',$rang=0) {

static $chiffre_unite=
array ("","un","deux","trois","quatre","cinq","six","sept","huit","neuf");
static $chiffre_dizaine_unite=
array ("dix","onze","douze","treize","quatorze","quinze","seize","dix-
sept","dix-huit","dix-neuf");
static $chiffre_dizaine=
array("","dix","vingt","trente","quarante","cinquante","soixante","soixante
","quatre-vingt","quatre-vingt");

static $chiffre_dizaine_be_ch=array(7=>"septante","huitante","nonante");


static $prefixe_milliers=
array("","mille","million","milliard","billion","billiard");

if ($nombre<0) $nombre=-$nombre; # valeur positive
if ($nombre>2147483647) return $nombre; # borne supérieure des integer...
$nombre=(double)floor($nombre); # valeur entière
if ($nombre==0) return "zéro";
if(($pays<>'ch') and ($pays<>'be') and ($pays<>'fr')) $pays='fr';

$unite=$nombre % 10 ; #chiffre des unités
$i=($nombre-$unite)/10;
$dizaine=$i % 10 ; #chiffre des dizaines
$i=($i-$dizaine)/10;
$centaine=$i % 10 ; # chiffres des centaines
$milliers=($i-$centaine)/10;
$retour_avant=$retour="";

# appel récursif pour les milliers, millions, etc.
if ($milliers>0) {
if ($rang<5)
$retour_avant=nombre_en_lettres($milliers,$pays,$rang+1)." ";
else $retour_avant=$milliers."E+18 " ;
}

# traitement du chiffre des centaines
if ($centaine>0) {
if ($centaine==1) $retour = "cent " ;
else {
$retour = $chiffre_unite[$centaine]." cent";

if ((($dizaine+$unite)==0) and ($rang==0)) $retour.="s ";


else $retour.=" "; # pas de 's' à cent dans 'deux cent dix'
}
}
# traitement du chiffre des dizaines et des unités

switch($unite) {
case 0:
$lien="";
break;
case 1:
$lien=" et ";
break;
default:
$lien="-";


}
switch($dizaine) {
case 0:
if (($unite==1) and ($rang==1) and ($centaine==0))

break; # 1000 tout seul


# 00 .. 09
$retour .= $chiffre_unite[$unite];
break;
case 1: # 10 .. 19
$retour .= $chiffre_dizaine_unite[$unite];
break;

case 8 : # 80 .. 89 (pour france et belgique)
if($pays<>'ch') {
$retour .= $chiffre_dizaine[$dizaine];
if($unite==0) {
if($rang==0) $retour .='s'; # 80 tout seul
}
else $retour .='-'.$chiffre_unite[$unite];
break;
}
case 7 : # 70 .. 79 (pour france)
case 9 : # 90 .. 99 (pour france)
if($pays=='fr') {
if (($unite==0) or (($dizaine==9) and ($unite==1)))
$lien="-"; # 70 90 91


$retour .= $chiffre_dizaine[$dizaine].$lien.

$chiffre_dizaine_unite[$unite];
break;
}
default: # 20 .. 69 (ou 70..99 hors de France)

if($dizaine<7) $retour .=$chiffre_dizaine[$dizaine];
else $retour .=$chiffre_dizaine_be_ch[$dizaine];
$retour .=$lien.$chiffre_unite[$unite];
}
# on ajoute mille, million si besoin

if ($rang>0)
$retour .= ($retour<>'' ? ' ' : '').$prefixe_milliers[$rang];
if (($rang>1) and ($nombre>1)) $retour .='s'; # pas de 's' à mille

# on renvoit le texte concaténé avec celui de l'appel supérieur
return $retour_avant.$retour;
} # de function nombre_en_lettres


NB : dans un 'case', si aucune instruction 'break' n'est rencontrée, le
programme exécute les instructions des 'case' ou 'default' suivants.

Olivier Miakinen

unread,
Apr 3, 2003, 5:44:22 AM4/3/03
to
Attention : ce message est publié simultanément dans trois groupes. Je
positionne le suivi vers le groupe d'origine, fr.comp.lang.php, qui est
modéré. N'hésitez pas à modifier le suivi selon le type de votre réponse.

Je publie aussi sur fr.sci.maths et sur fr.lettres.langue.francaise,
surtout pour avoir confirmation des règles concernant les accords de
"cent(s)" et "quatre-vingt(s)" (points 4 et 5).


Résumé des épisodes précédents (pour ceux qui ne suivent pas fclp) :

Filon avait un programme écrit dans un langage nommé VBA, qu'il voulait
adapter en PHP. Ce programme prend en entrée une somme en chiffres (par
exemple 203,65) et l'écrit en toutes lettres (deux cent trois euros
soixante-cinq). Plusieurs personnes ont proposé des scripts PHP
équivalents, écrits par eux-mêmes ou trouvés sur la toile. Tous ces
scripts (y compris le programme VBA d'origine) sont bugués et incomplets.


Le 01/04/2003 22:30, P'tit Marcel a écrit :
> Version corrigée du script en fonction des remarques d'Olivier:

Je me suis pris au jeu, et j'ai presque fini un programme que j'espère
universel (francophone seulement, faut pas pousser non plus).

1) De base, il sait traduire les nombres en lettres jusqu'à 10^42 - 1
(milliers de sextillions). On peut facilement le modifier pour rajouter
des blocs de 6 chiffres (septillions, octillions, ..., décillions, ...,
centillions, ...).

2) Il sait gérer plusieurs versions différentes de 70, 80 et 90 :
France : soixante-dix, quatre-vingts, quatre-vingt-dix
Belgique : septante, quatre-vingts, nonante
Régional avec huitante : septante, huitante, nonante
Régional avec octante : septante, octante, nonante
(on peut rajouter des variantes)

3) Sur option, il sait utiliser ou non les milliards :
un, mille,
un million, mille millions *ou* un milliard,
un billion, mille billions,
un trillion, mille trillions...

4) Il respecte les accords de "cent" :
deux cents
deux cent un
mille cent
mille deux cents
mille deux cent un
deux cent mille
deux cents millions

5) Il respecte les accords de "quatre-vingt" :
quatre-vingts
quatre-vingt-un
quatre-vingt mille
quatre-vingts millions

Je ne prévois pas en revanche :

a) La signification des billions, trillions, etc. d'avant 1948 (i.e.
similaire à celle de l'américain)

b) Le support des "et" optionnels (mille [et] un)

c) "mil" au lieu de "mille"

d) "onze cents" au lieu de "mille cent"

Je ne sais pas encore si je vais envisager la génération automatique des
noms en "illion" (il y a sur la toile un programme Perl qui fait ça).

Enfin, pour la traduction des montants en euros ou ce qu'on veut, il me
semble que cela peut-être une fonction séparée : on y gagne en légèreté.


Je publierai bientôt l'url permettant de récupérer et (ou) de tester le
programme, mais tous les commentaires sont d'ores et déjà les bienvenus.

Olivier.

(sic)

unread,
Apr 3, 2003, 12:10:40 PM4/3/03
to
"Olivier Miakinen" <Olivier....@evidian.com> a écrit dans le
message de news: 3E8BFE1D...@evidian.com...

> Je publie aussi sur fr.sci.maths et sur fr.lettres.langue.francaise,
> surtout pour avoir confirmation des règles concernant les accords
> de "cent(s)" et "quatre-vingt(s)" (points 4 et 5).

> 4) Il respecte les accords de "cent" :
> deux cents

Problème pour les dates, les pages, les adresses : page deux cent, cela
se passe en mille huit cent.
Ce sont des ordinaux, pas des cardinaux.

> 5) Il respecte les accords de "quatre-vingt" :
> quatre-vingts

Même problème.

> c) "mil" au lieu de "mille"

L'usage n'est plus obligatoire et « mille » n'est plus considéré comme
une faute dans « mille neuf cent ». « Mil » n'intervient que dans les
dates de l'ère chrétienne comprises entre mil et deux mille, et pas dans
les autres calendriers. Voir http://www.langue-fr.net/, article «
mille » dans l'index.

Marion Gevers

unread,
Apr 3, 2003, 12:10:41 PM4/3/03
to
Le 03 Apr 2003 10:44:22 GMT, Olivier Miakinen a écrit :
> Attention : ce message est publié simultanément dans trois groupes. Je
> positionne le suivi vers le groupe d'origine, fr.comp.lang.php, qui est
> modéré. N'hésitez pas à modifier le suivi selon le type de votre réponse.
>
> Je publie aussi sur fr.sci.maths et sur fr.lettres.langue.francaise,
> surtout pour avoir confirmation des règles concernant les accords de
> "cent(s)" et "quatre-vingt(s)" (points 4 et 5).
>
>
>
> 4) Il respecte les accords de "cent" :
> deux cents
> deux cent un
> mille cent
> mille deux cents
> mille deux cent un
> deux cent mille

J'écrirais « deux cents mille ».

> deux cents millions
>
> 5) Il respecte les accords de "quatre-vingt" :
> quatre-vingts
> quatre-vingt-un
> quatre-vingt mille

J'écrirais « quatre-vingts mille ».

Marion
--
Marion Gevers,
Newcastle, NSW, Australia
mar...@eepjm.newcastle.edu.au

Olivier Miakinen

unread,
Apr 3, 2003, 12:58:57 PM4/3/03
to
(sic), puisque tu sembles être un intervenant assidu de fllf, et que ta
réponse concerne vraiment la langue française, je redirige la discussion
vers fllf. J'aurais d'ailleurs dû le faire dès le début, vu la teneur de
mes questions.

Le 03/04/2003 19:10, (sic) a écrit :
>
>> 4) Il respecte les accords de "cent" :
>> deux cents
>
> Problème pour les dates, les pages, les adresses : page deux cent, cela
> se passe en mille huit cent.
> Ce sont des ordinaux, pas des cardinaux.

Excellente remarque, qui m'amène une autre question. Supposons que l'on
ait un livre très très gros. Comment écrire « la page 200 000 000 » :
deux cents millions, deux cent millions ou deux cents million ?

[ Je prévoierai le cas des ordinaux dans mon programme, si ce n'est pas
trop compliqué ]

>> 5) Il respecte les accords de "quatre-vingt" :
>> quatre-vingts
>
> Même problème.

En ce qui concerne 80, mon Petit Robert 1990 n'a pas la même clarté que
pour 200. Il n'y a aucune règle explicite à l'entrée « quatre-vingt »,
et les exemples de la page finale laissent entendre qu'on devrait écrire
« quatre-vingts mille ». Pour le moment je fais confiance à André
Juilly, qui écrivait le 19/10/2002 :

| La règle est de laisser cent ou quatre-vingt invariables devant
| un adjectif numéral.
| Mille en est un, million ou millier sont des substantifs (des noms,
| si vous préférez).

http://www.google.fr/groups?selm=ao2192%24b8d%241%40news-reader10.wanadoo.fr

>> c) "mil" au lieu de "mille"
>
> L'usage n'est plus obligatoire et « mille » n'est plus considéré comme
> une faute dans « mille neuf cent ». « Mil » n'intervient que dans les
> dates de l'ère chrétienne comprises entre mil et deux mille, et pas dans
> les autres calendriers. Voir http://www.langue-fr.net/, article «
> mille » dans l'index.

Ici, donc : http://www.langue-fr.net/index/M/mille.htm
Merci pour l'info.

J'ai d'ailleurs trouvé d'autres pages intéressantes en cherchant
« nombre » dans l'index : http://www.langue-fr.net/index/N/N.htm

Didier Lauwaert

unread,
Apr 4, 2003, 3:02:30 AM4/4/03
to
Olivier Miakinen <Olivier....@evidian.com> wrote in message news:<3E8BFE1D...@evidian.com>...

> Attention : ce message est publié simultanément dans trois groupes. Je
> positionne le suivi vers le groupe d'origine, fr.comp.lang.php, qui est
> modéré. N'hésitez pas à modifier le suivi selon le type de votre réponse.
>
> Je publie aussi sur fr.sci.maths et sur fr.lettres.langue.francaise,
> surtout pour avoir confirmation des règles concernant les accords de
> "cent(s)" et "quatre-vingt(s)" (points 4 et 5).

Chez nous (mais les belges comptent différemment :-)
seul million, milliard, et suivants sont des substantifs
et donc s'accordent.

Avant j'avais le code qui faisait ce job "montant en lettre"
(dans un programme commercial, donc sérieux :-)
en français, néerlandais, anglais, allemand, tchèque.
Je ne sais plus si on faisait la distinction France/Belgique.
Mais je ne sais pas où je l'ai foutu et de plus
il y a un petit problème de copyright :o)

Reply all
Reply to author
Forward
0 new messages