Newsgroup: it.comp.java
Titolo: Converitre numero nella sua rappresentazione letterale

Ho bisogno di poter convertire un numero nella sua rappresentazione
letterale. Ed esempio da 1992 devo ottenere la stringa
"millenovecentonovatadue".
Qualcuno è a conoscenza di qualche funzione o qualche libreria java che
faccia tutto ciò?
PS lo so che sarebbe molto semplice scrivere la funzione da zero ma perchè
reinventare la ruota se questa esiste già? 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 faccia tutto ciò?
Non mi pare che esista una cosa simile, anche perchè trasformare 1992 in 
"millenovecentonovatadue" è relativo all'italiano e sarebbe proprio un 
bel lavoro inserire in java la rappresentazione dei numeri in parole 
delle varie lingue. Comunque potresti continuare a cercare caso mai su 
google.it...
Certo che alla fine è un bel lavorone anche per l'italiano perchè devi 
considerare non una cifra per volta ma anche la sua posizione se unità, 
decina, centinaia, ecc...
Ciao,
jRed

 google.it...
Mi sembra di ricordare che ho visto qualche programma che lo faceva. 
Purtroppo non ricordo se era in java ne' tantomeno dove l'ho visto, 
magari cercando con google si potrebbe trovare...
Andrea

 faccia tutto ciň?
Non penso sia difficilissimo fare un programmino che faccia ciň, certo c'č
da perderci un bel pň di tempo con i substring :-)

 reinventare la ruota se questa esiste già? 
Ripensandoci mi sono messo li a farla. (non avevo voglia di andare a 
dormire e in tv non faceva nulla ;-)...
Ecco il risultato. Sicuramente non è il massimo dell'eleganza e può 
esere migliorata, però funziona.
Andrea
P.S.
Codice rilasciato con licenta FCTPL (Fai Come Ti Pare License) ;-)
---------------------------------------------------------------------
/*
  * Created on 8-set-2004
  */
/**
  * @author Andrea
  */
public class Letterale {
   private static final long MILIARDO = 1000000000;
   private static final long MILIONE = 1000000;
   private static String[] unitaStr = {
           "", "uno", "due", "tre", "quattro", "cinque",
           "sei", "sette", "otto", "nove", "dieci",
           "undici", "dodici", "tredici", "quattordici", "quindici",
           "sedici", "diciassette", "diciotto", "diciannove"};
   private static boolean[] rimuoviLast = {
     false, true, false, false, false, false,
     false, false, true, false
   };
   private static String[] decineStr = {
           "venti", "trenta", "quaranta",
           "cinquanta", "sessanta", "settanta", "ottanta", "novanta"};
   public static String converti(long numero){
     if(numero >= 1e15)
       throw new IllegalArgumentException("Numero troppo grande: " + 
numero +
               "\nNon deve superare 
novecentonovantanovemilanovecentonovantanove miliardi 
novecentonovantanove milioni 
novecentonovantanovemilanovecentonovantanove.");
     if(numero == 0)
       return "zero";
     StringBuffer rappresentazione = new StringBuffer();
     long miliardi = numero / MILIARDO;
     if(miliardi > 1){
       rappresentazione.append(converti(miliardi)).append(" miliardi ");
       numero = numero % MILIARDO;
     } else if (miliardi == 1) {
       rappresentazione.append(" un miliardo ");
       numero = numero % MILIARDO;
     }
     long milioni = numero / MILIONE;
     if(milioni > 1){
       rappresentazione.append(converti(milioni)).append(" milioni ");
       numero = numero % MILIONE;
     } else if (milioni == 1) {
       rappresentazione.append(" un milione ");
       numero = milioni % MILIONE;
     }
     long migliaia = numero/1000;
     if(migliaia > 1) {
       rappresentazione.append(converti(migliaia)).append("mila");
       numero = numero % 1000;
     }else if (migliaia == 1){
       rappresentazione.append("mille");
       numero = numero % 1000;
     }
     long centinaia = numero / 100;
     if(centinaia > 1){
       rappresentazione.append(converti(centinaia)).append("cento");
       numero = numero % 100;
     } else if (centinaia == 1) {
       rappresentazione.append("cento");
       numero = numero % 100;
     }
     if(centinaia > 0 && numero < 90 && numero > 80) {
       // centoottanta -> centottanta
       rappresentazione.setLength(rappresentazione.length()-1);
     }
     assert(numero < 100);
     if(numero>19){
       int decine = (int) (numero / 10);
       rappresentazione.append(decineStr[decine-2]);
       numero = numero%10;
       if(rimuoviLast[(int) numero])
         rappresentazione.setLength(rappresentazione.length()-1);
     }
     rappresentazione.append(unitaStr[(int) numero]);
     return rappresentazione.toString();
   }
   public static void main(String[] args) {
     System.out.println("123456789012345 - " + converti(123456789012345l));
   }
}
---------------------------------------------------------------------

 esere migliorata, però funziona.
Ovviamente è sottinteso che non garantisco che il codice sia esente da 
bug ;-)
Andrea

 bug ;-)
Bhè io l'ho provato e tira fuori questo, guarda un po' se ti può essere 
utile per migliorarlo (compilato sulla 1.4.2_05 su x86):
Letterale.java:79: warning: as of release 1.4, assert is a keyword, and 
may not
be used as an identifier
     assert(numero < 100);
     ^
Letterale.java:79: cannot resolve symbol
symbol  : method assert (boolean)
location: class Letterale
     assert(numero < 100);
     ^
1 error
1 warning
Comunque bella l'idea di questa classetta! :-D

 utile per migliorarlo (compilato sulla 1.4.2_05 su x86):
Per compilarlo devi specificare la "source compatibility" con la
versione 1.4.
Di default il JDK 1.4 si aspetta un sorgente compatibile con la 1.3, io
invece ho usato gli assert che sono presenti solo dalla 1.4.
Prova a compilare con la seguente riga di comando:
javac -source 1.4 Letterale.java
In alternativa puoi semplicemente eliminare la riga incriminata, tanto
serve solo per il debug (e come "documentazione").
Andrea

 serve solo per il debug (e come "documentazione").
No, non avrebbe molto senso. Mi piacerebbe capire un po' di più cosa fa 
quel metodo, e in che ambito può essere usato! :-D
Ciao,
jRed

 quel metodo, e in che ambito può essere usato! :-D
Questo è semplice. Tanto per cominciare assert non è un metodo ma una 
parola riservata (come int, void, static, for, eccetera). Non si tratta 
della chiamata di un metdo, infatti la sintassi corretta è:
assert <espressione> [ : <espressione2>] ;
Nel mio caso "assert (numero < 1000)" serve solo ad affermare che in 
quel punto del codice numero è sempre minore di 1000.
Normalmente questo, in realtà, non ha alcun effetto.
Se invece si esegue il programma passando il parametro -ea, le assert 
vengono abilitate. Questo significa che la vm controlla effettivamente 
che numero < 1000 e se non è così viene fatto il throw di un AssertionError.
Per altre informazioni puoi guardare qui':
http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html
Andrea

Ok, ho capito, in molti casi potrebbe essere un'espressione utile sia 
allo sviluppatore sia in alcuni casi al runtime.
Ho visto che sono nelle docs, una sfogliatina salutare non fa mai male! :-D
Peccato solo per l' -ea ma in genere si risolve tutto con un piccolo 
.bat o .sh!
Ciao,
jRed
PS: Ma non appesantiranno il tutto? (Secondo me no, ma rimane il dubbio 
se vale la pena usarle o passare per vie alternative!)


jRed wrote:
 > PS: Ma non appesantiranno il tutto? (Secondo me no, ma rimane il dubbio
 > se vale la pena usarle o passare per vie alternative!)
La documentazione dice
"Disabling assertions eliminates their performance penalty entirely. 
Once disabled, they are essentially equivalent to empty statements in 
semantics and performance".
Non so dirti che si intenda esattamente per "empty statements", pero' 
direi che l'affermazione è abbastanza forte
Andrea

      }
La sto buttando senza ragionarci su (e senza guardare tutto l'algoritmo):
numero non deve essere >=80?


Hai ragione. Il codice l'ho scritto in pochi minuti, quindi qualche 
imprecisione concedetemela ;-)
Andrea