Conversion chiffre en lettre [Résolu]

davidbig 10 Messages postés jeudi 3 mars 2011Date d'inscription 18 septembre 2017 Dernière intervention - 18 sept. 2017 à 11:03 - Dernière réponse :  smarticu
- 22 oct. 2017 à 15:25
Bonjour,
j'ai fait une petite application en java pour convertir les chiffres en lettre mais je n'arrive pas à convertir les chiffres>10millions. la fonction retourne rien.
voici le code que j'utilise:

public enum Nombre {
 //nombre simple
 ZERO(0, "zero"),UN(1, "un"),DEUX(2, "deux"),TROIX(3, "trois"),
 QUATRE(4,"quatre"),CINQ(5, "cinq"),SIX(6, "six"),SEPT(7, "sept"),
 HUIT(8,"huit"),NEUF(9, "neuf"),DIX(10, "dix"),ONZE(11, "onze"), 
 DOUZE(12, "douze"),TREIZE(13, "treize"),QUATORZE(14, "quatorze"),
 QUINZE(15, "quinze"),SEIZE(16, "seize"),DIXSEPT(17, "dix-sept"),
 DIXHUIT(18, "dix-huit"),DIXNEUF(19, "dix-neuf"),
 
 //de 20 à 99
 VINGT(20, 29, "vingt"),
 TRENTE(30, 39, "trente"),
 QUARANTE(40, 49, "quarante"), 
 CINQUANTE(50, 59, "cinquante"),
 SOIXANTE(60, 69, "soixante"),
 SOIXANTEDIX(70, 79, "soixante-dix", SOIXANTE),
 QUATREVINGT(80, 89,"quatre-vingt","s"),
 QUATREVINGTDIX(90, 99, "quatre-vingt-dix",QUATREVINGT),
 
 //de 10 à X milliard
 DIXAINE(10, 99),
 CENT(100, 999, "cent",DIXAINE),
 MILLE(1000, 999999, "mille", CENT),
 MILLION(1000000,999999999, "million", MILLE),
 MILLIARD(1000000000, Long.MAX_VALUE,"milliard", MILLION),
 
 //enum de calcul
 CALCULATE(){
  protected String getValue(long value)throws Exception {
   if (value == 0) return ZERO.label;
   else return ((value < 0) ? "moins " : "")+ MILLIARD.getStringValue((Math.abs(value)));
  }

  protected String getValue(double value,String separator)throws Exception {
   if (value == 0) return ZERO.label+" "+separator;
   else{
    StringBuilder sb = new StringBuilder();
    sb.append((value < 0) ? "moins " : "");
    String vstr = Double.toString(value);
    
    int indexOf = vstr.indexOf('.');
    
    if(indexOf == -1){
     sb.append(MILLIARD.getStringValue((long)(Math.abs(value))));
     sb.append(" ");
     sb.append(separator);
    }else{
     sb.append(MILLIARD.getStringValue(Long.parseLong(vstr.substring(0, indexOf))));
     sb.append(" ");
     sb.append(separator);
     String floatting =vstr.substring(indexOf+1,(indexOf+3>=vstr.length())?vstr.length():indexOf+3)+(indexOf+3>=vstr.length()?"0":"");
     long v = Long.parseLong(floatting);
     if(v!=0){
      sb.append(" ");
      sb.append(MILLIARD.getStringValue(v));
     }
    }
    return sb.toString();
   }
  }

 };

 protected long min, max;
 protected String label;
 protected Nombre before;
 // valeur à ajout à la fin d'un nombre entier
 private String addMin;
 /* constructeurs*/
 Nombre() {
 }

 Nombre(long v, String s) {
  this(v, v, s);
 }

 Nombre(long min, long max) {
  this.min = min;
  this.max = max;
 }

 Nombre(long min, long max, String label, Nombre before) {
  this(min, max, label);
  this.before = before;
 }

 Nombre(long min, long max, String label,String addMin) {
  this(min, max, label);
  this.addMin = addMin;
 }
 
 Nombre(long min, long max, String label) {
  this(min, max);
  this.label = label;
 }
 
 protected String getValue(long value)throws Exception{
  throw new Exception("Vous devez appeller la méthode par l'énumération Chiffre.CALCULATE");
 }

 protected String getValue(double value,String separator)throws Exception{
  throw new Exception("Vous devez appeller la méthode par l'énumération Chiffre.CALCULATE");
 }

 // fonction de transformation
 private String getStringValue(long value) {
  long v1 = value / this.min;
  if (v1 == 0 && before != null)return before.getStringValue(value);

  StringBuilder add = new StringBuilder();
  Nombre[]values = Nombre.values();
  if(value<20) return values[(int)value].label;
  for (int i = 0; i < values.length; i++) {
   Nombre nombre = values[i];
   //si la valeur est inférieur à 100
   if (value < 100 && nombre.min <= value && nombre.max >= value) {
    //cas des valeurs 20, 30, 40, etc...
    if (value == nombre.min) return nombre.label+((nombre.addMin!=null)?nombre.addMin:"");
    //cas de 71->79 et 91->99
    else if (nombre.before != null){
     StringBuilder sb = new StringBuilder(nombre.before.label);
     //71
     sb.append(((value - nombre.min + 10 == 11 && nombre.equals(SOIXANTEDIX)) ? " et " : "-"));
     sb.append(DIXAINE.getStringValue(value - nombre.min + 10));
     return sb.toString();
    }else{
     StringBuilder sb = new StringBuilder(nombre.label);
     //81
     sb.append(((value - nombre.min == 1 && !nombre.equals(QUATREVINGT)) ? " et " : "-"));
     //second chiffre
     sb.append(((value - nombre.min > 0) ? DIXAINE.getStringValue(value - nombre.min) : ""));
     return sb.toString();
    }
   } else if (nombre.min <= v1 && nombre.max >= v1 && value >= 100) {
    //première partie du nombre
    
    //100 et 1000
    if ((this.equals(MILLE) || this.equals(CENT))&& Nombre.UN.equals(nombre))
     add.append(label);
    else{
     add.append(nombre.getStringValue(v1));
     //cas : Million de millard et Milliard de milliard 
     add.append(((MILLIARD.equals(this)&& (MILLION.equals(nombre) || MILLIARD.equals(nombre)) ? " de" : "")));
     //ajout du label si présent
     add.append(((label != null) ? " " + label : ""));
    }
    //deuxième partie du nombre
    add.append(((value - (v1 * this.min) > 0) ? (" " + before.getStringValue(value - (v1 * this.min))): (v1 > 1) ? "s" : ""));
    return add.toString();
   }
  }
  return add.toString();
 }
}

pour la conversion j'utilise l'instruction, avec 2 arguments le chiffre(12569000) et Francs bu la devise:
String lettre= Nombre.CALCULATE.getValue(12569000,"Francs Bu");
Afficher la suite 
10Messages postés jeudi 3 mars 2011Date d'inscription 18 septembre 2017 Dernière intervention

2 réponses

Répondre au sujet
KX 15087 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 18 sept. 2017 à 13:25
0
Utile
Bonjour,

"j'ai fait une petite application en java pour convertir les chiffres en lettre"
Tu as surtout fait un gros copier-coller... on appelle ça du plagiat !

Le code d'origine est ici et il fonctionne très bien avec les millions et les milliards. Exemples :

12569000
إثنا عشر مليون و خمسمائة و تسعة و ستون الف

1234567890
مليار و مائتين و أربعة و ثلاثون مليون و خمسمائة و سبعة و ستون الف و ثمانمائة و تسعون
Commenter la réponse de KX
0
Utile
Le code d'origine est plutôt celui-là : http://codes-sources.commentcamarche.net/source/view/51537/1221051#browser

Code écrit en 2010. Tu as surtout fait un gros copier-coller... on appelle ça du plagiat !
Commenter la réponse de smarticu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.