ECRIRE UN NOMBRE ENTIER EN TOUTE LETTRE

Signaler
Messages postés
33
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
25 avril 2003
-
Messages postés
1
Date d'inscription
jeudi 27 mai 2010
Statut
Membre
Dernière intervention
27 mai 2010
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/15542-ecrire-un-nombre-entier-en-toute-lettre

Messages postés
1
Date d'inscription
jeudi 27 mai 2010
Statut
Membre
Dernière intervention
27 mai 2010

Bonjour,

Je vous remercie pour les codes, à moi donc d'ajouter ma pierre à l'édifice et vous proposant une version qui (normalement) respecte les "-" et les "s" et permet aussi de tenir compte (si l'on veut) des recommandations de 1990 liées à l'écriture des nombres.
y a encore de l'optimisation à faire .... mais ça marche.




public class NombreEnLettre {
/**
* Représentaion en lettre de 0
*/
public static final String ZERO = "zéro";

/**
* Représentaion en lettre de 1
*/
public static final String UN = "un";

/**
* Représentaion en lettre de 2
*/
public static final String DEUX = "deux";

/**
* Représentaion en lettre de 3
*/
public static final String TROIS = "trois";

/**
* Représentaion en lettre de 4
*/
public static final String QUATRE = "quatre";

/**
* Représentaion en lettre de 5
*/
public static final String CINQ = "cinq";

/**
* Représentaion en lettre de 6
*/
public static final String SIX = "six";

/**
* Représentaion en lettre de 7
*/
public static final String SEPT = "sept";

/**
* Représentaion en lettre de 8
*/
public static final String HUIT = "huit";

/**
* Représentaion en lettre de 9
*/
public static final String NEUF = "neuf";

/**
* Représentaion en lettre de 10
*/
public static final String DIX = "dix";

/**
* Représentaion en lettre de 11
*/
public static final String ONZE = "onze";

/**
* Représentaion en lettre de 12
*/
public static final String DOUZE = "douze";

/**
* Représentaion en lettre de 13
*/
public static final String TREIZE = "treize";

/**
* Représentaion en lettre de 14
*/
public static final String QUATORZE = "quatorze";

/**
* Représentaion en lettre de 15
*/
public static final String QUINZE = "quinze";

/**
* Représentaion en lettre de 16
*/
public static final String SEIZE = "seize";

/**
* Représentaion en lettre de 20
*/
public static final String VINGT = "vingt";

/**
* Représentaion en lettre de 30
*/
public static final String TRENTE = "trente";

/**
* Représentaion en lettre de 40
*/
public static final String QUARANTE = "quarante";

/**
* Représentaion en lettre de 50
*/
public static final String CINQUANTE = "cinquante";

/**
* Représentaion en lettre de 60
*/
public static final String SOIXANTE = "soixante";

/**
* Représentaion en lettre de 100
*/
public static final String CENT = "cent";

/**
* Représentaion en lettre de 1000
*/
public static final String MILLE = "mille";

/**
* Représentaion en lettre de 1000000
*/
public static final String MILLION = "million";

/**
* Représentaion en lettre de 1000000000
*/
public static final String MILLIARD = "milliard";

/**
* Représentaion en lettre de -
*/
public static final String MOINS = "moins";

// Nom des différents types de paquet de nombre
private static final String[] tab = { "", MILLE, MILLION, MILLIARD, MILLE + " " + MILLIARD,
MILLION + " de " + MILLIARD, MILLIARD + " de " + MILLIARD };

/**
* Renvoie la représentation en lettre d'un chiffre, c'est à dire d'un
* nombre ente 0 et 9
*/
public static String getChiffre(int l) {
if ((l < 0) || (l > 9))
throw new IllegalArgumentException("Un chiffre est entre 0 et 9, donc " + l + " est interdit");
switch (l) {
case 0:
return ZERO;
case 1:
return UN;
case 2:
return DEUX;
case 3:
return TROIS;
case 4:
return QUATRE;
case 5:
return CINQ;
case 6:
return SIX;
case 7:
return SEPT;
case 8:
return HUIT;
case 9:
return NEUF;
}
return null;
}

// Retourne la représentation en lettre d'un paquet. Un paquet est formé de
// tois chiffres, comme 123, 012, 001, 100, 101,...
private static String paquet(int p) {
// On initialise la réponse
String reponse = "";

if (p == 100) {
reponse = CENT;
return reponse.trim();
}
// Si on a un chiffre des centaines
if (p > 100) {
// Si la valeur est >199 alors, on va mettre devant le chiffre des
// centaine
if (p / 100 > 1)
reponse = getChiffre(p / 100) + " ";
// C'est une centaine, donc on ajoute ensuite "cent"

reponse += CENT;
if ((p / 100 > 1) && (p % 100 == 0))
reponse += "s ";
else
reponse += " ";

// On récupére ce qui n'est pas la centaine
p = p % 100;
}
// c chiffre des dizaines
// u chiffre des unitées
int c = p / 10;
int u = p % 10;
switch (c) {
// Si la dizaine est nulle, alors le nombre est un chiffre
case 0:
if (u != 0)
reponse += getChiffre(u);
break;
case 1:
switch (u) {
case 0:
reponse += DIX;
break;
case 1:
reponse += ONZE;
break;
case 2:
reponse += DOUZE;
break;
case 3:
reponse += TREIZE;
break;
case 4:
reponse += QUATORZE;
break;
case 5:
reponse += QUINZE;
break;
case 6:
reponse += SEIZE;
break;
default:
reponse += DIX + "-" + getChiffre(u);
}
break;
case 2:
reponse += VINGT;
if (u == 1)
reponse += " et";
if (u == 1)
reponse += " " + getChiffre(u);
if (u > 1)
reponse += "-" + getChiffre(u);
if (u == 0)
reponse += "s";
break;
case 3:
reponse += TRENTE;
if (u == 1)
reponse += " et";
if (u == 1)
reponse += " " + getChiffre(u);
if (u > 1)
reponse += "-" + getChiffre(u);
break;
case 4:
reponse += QUARANTE;
if (u == 1)
reponse += " et";
if (u == 1)
reponse += " " + getChiffre(u);
if (u > 1)
reponse += "-" + getChiffre(u);
break;
case 5:
reponse += CINQUANTE;
if (u == 1)
reponse += " et";
if (u == 1)
reponse += " " + getChiffre(u);
if (u > 1)
reponse += "-" + getChiffre(u);
break;
case 6:
reponse += SOIXANTE;
if (u == 1)
reponse += " et";
if (u == 1)
reponse += " " + getChiffre(u);
if (u > 1)
reponse += "-" + getChiffre(u);
break;
case 7:
reponse += SOIXANTE;
if (u == 1)
reponse += " et";
switch (u) {
case 0:
reponse += "-" + DIX;
break;
case 1:
reponse += " " + ONZE;
break;
case 2:
reponse += "-" + DOUZE;
break;
case 3:
reponse += "-" + TREIZE;
break;
case 4:
reponse += "-" + QUATORZE;
break;
case 5:
reponse += "-" + QUINZE;
break;
case 6:
reponse += "-" + SEIZE;
break;
default:
reponse += "-" + DIX + "-" + getChiffre(u);
}
break;
case 8:
reponse += QUATRE + "-" + VINGT;
if (u > 0)
reponse += "-" + getChiffre(u);
if (u == 0)
reponse += "s";
break;
case 9:
reponse += QUATRE + "-" + VINGT + "-";
switch (u) {
case 0:
reponse += DIX;
break;
case 1:
reponse += ONZE;
break;
case 2:
reponse += DOUZE;
break;
case 3:
reponse += TREIZE;
break;
case 4:
reponse += QUATORZE;
break;
case 5:
reponse += QUINZE;
break;
case 6:
reponse += SEIZE;
break;
default:
reponse += DIX + "-" + getChiffre(u);
}
break;
}
// On renvoie la réponse, à laquelle on retire les éventuels espaces
// surperflus
return reponse.trim();
}

public static String convert(String w){
int p1 = w.indexOf(".");
int p2 = w.indexOf(",");

if (p1!=-1){
String partieEntiere = w.substring(0,p1);
String partieVirgule = w.substring(p1+1);
w = NombreEnLettre.getLettre(partieEntiere)+" virgule "+NombreEnLettre.getLettre(partieVirgule);
}
if (p2!=-1){
String partieEntiere = w.substring(0,p2);
String partieVirgule = w.substring(p2+1);
w = NombreEnLettre.getLettre(partieEntiere)+" virgule "+NombreEnLettre.getLettre(partieVirgule);
}

if ( (p1 == -1) && (p2==-1)){
// nombre entier
return NombreEnLettre.getLettre(w);
}

return w;
}


public static String getLettre(String w) {
w = w.trim();
String rep = w;
try {
long number = Long.parseLong(w);
rep = NombreEnLettre.getLettre(number);
} catch (NumberFormatException nfe) {
System.out.println("Conversion impossible.... n'est pas un nombre");
}
return rep;
}

private static String checkForMilliard(String w) {
try{
int p = w.indexOf("milliards");
if (p != -1) {
w = w.substring(0, p - 1) + " " + w.substring(p, p + 9) + " " + w.substring(p + 10);
return w;
}
p = w.indexOf("milliard");
if (p != -1) {
w = w.substring(0, p - 1) + " " + w.substring(p, p + 8) + " " + w.substring(p + 9);
return w;
}
}catch (Exception e){
w = w.replaceAll("-", " ");
}
return w;
}


private static String checkForMillion(String w) {
try{
int p = w.indexOf("millions");
if (p != -1) {
w = w.substring(0, p - 1) + " " + w.substring(p, p + 8) + " " + w.substring(p + 9);
return w;
}
p = w.indexOf("million");
if (p != -1) {
w = w.substring(0, p - 1) + " " + w.substring(p, p + 7) + " " + w.substring(p + 8);
return w;
}
}catch (Exception e){
w = w.replaceAll("-", " ");
}

return w;
}

public static String checkForVirgule(String w){
int p = w.indexOf("-virgule-");
if (p!=-1){
String s[] = w.split("-virgule-");
w = s[0]+" virgule "+s[1];
}

return w;
}

public static String convertToRecommandation1990(String w) {
w = w.replaceAll(" ", "-");

w = NombreEnLettre.checkForMilliard(w);
w = NombreEnLettre.checkForMillion(w);
w = NombreEnLettre.checkForVirgule(w);
return w;
}

/**
* Renvoie le nombre en lettre,

* ex: 1234567890 devient : un milliard deux cent trente quatre million cinq
* cent soixante sept mille huit cent quatre vingt dix
*/
public static String getLettre(long l) {
// Cas zéro
if (l == 0L)
return ZERO;
String signe = "";
// Cas négatif
if (l < 0L) {
// On prned la valeur absolue
l = -l;
// On ajoutera moins devant
signe = MOINS + " ";
}
// Initilisation de la réponse
String reponse = "";
// Rang du paquet actuel, on va parcourir le nombre de gauche à droite,
// le premier paquet de 123456 sera donc : 456
int rang = 0;
while (l > 0L) {
String pluriel = "";
if (tab[rang].equals("million") || tab[rang].equals("milliard")) {
if ((l % 1000L) > 1)
pluriel = "s";
}

// on ajoute le paquet devant la réponse
if ((l % 1000L)!=0)
reponse = paquet((int) (l % 1000L)) + " " + tab[rang] + pluriel + " " + reponse;

if (tab[rang].equals("mille") && (l % 1000L == 1)) {
reponse = reponse.substring(3);// on enleve "un "
}

// on passe au paquet suivant
l = l / 1000L;
rang++;
}

reponse = signe + reponse;
return reponse.trim();
}



}
Messages postés
6
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
5 janvier 2010

EREUUUUUUUUUUUUUUUUUUUR lol.

Ta source est vraiment intéressante , mais je viens de trouver une erreur , ça sera géniale de la corriger.
C'est en fait pour les centaines :

Par exemple : 55100 donne cinquante cinq mille (ce qui faux)
et pire : 100 ne retourne aucun résultat !!!
Messages postés
1
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
1 décembre 2009

bonjour
comment faire pr telechargez le zip
merci
Messages postés
3
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
17 avril 2009

merci pour ce code ca m'était vraiment trés utile
Afficher les 15 commentaires