WinstonSmith ha scritto:
Ho provato a basarmi sul resto e sulla divisione, ma credo d'essere lontanissimo dalla soluzione ideale...
No, mi spiace. Quello che hai scritto non ha assolutamente alcun senso.
Innanzitutto NON devi fare tonnellate di divisioni/moduli per qualunque cosa. Hai un numero di 4 cifre, quindi ti basta fare quelle poche operazioni per ottenere 4 int separati con ciascuno il numero 0...9. E per farlo puoi anche fare una cosa "furba", un metodo ad esempio da usare come:
int migliaia = estraiDigit(numero, 1000);
int centinaia = estraiDigit(numero, 100);
...
Dove estraiDigit è un banalissimo metodo con 1 (UNA!) riga di codice dentro. Stop, tutto lì e hai i 4 digit. (p.s. puoi anche evitare il estraiDigit e fare tutto lì "in linea".. era solo per farti ragionare)
Poi l'ho detto prima: hai scritto e/o analizzato un po' di casi? Le migliaia e le centinaia sono abbastanza lineari e possono essere trattati singolarmente per il loro pezzetto di stringa. Molti dei casi particolari sono invece nei valori 0...99.
I primi 20 valori (0..19) sono i casi molto "particolari" (e i primi 10 da 0 a 9 li dovrai RI-utilizzare sovente!!), li si mette generalmente in un array:
String[] primiVenti = { "zero", "uno", ......... };
Se i due digit "bassi" rappresentano un valore tra 0 e 19, banalmente si "indirizza" nell'array e stop.
Poi hai analizzato il resto?
venti
ventuno
ventidue
ventitre
ventiquattro
venticinque
ventisei
ventisette
ventotto
ventinove
Se noti, ventuno e ventotto sono gli unici a NON avere la "i" di vent
i. E se ragioni/provi, una cosa analoga c'è per tutti i valori 3x, 4x, 5x, 6x, 7x, 8x e 9x. Quindi cosa ti potrebbe far pensare? Magari di fare un array in cui ci sono le decine senza la finale:
String[] decine = { "", "", "vent", "trent", ..... };
La decina 2x è l'unica con la "i" finale. Le altre hanno la "a" finale. Metti la decina troncata e metti la finale ma solo se l'unità non è 1 o 8. E infine aggiungi la stringa dell'unità ma solo se non è 0 (da quell'array primiVenti).
E continui i ragionamenti così. E arriverai ad un codice che è MOLTO più corto e migliore di quello che hai scritto.
EDIT: e anzi, magari eventualmente 2 array per le decine, uno senza finali e l'altro con finali. Evita perlomeno il test per il caso 2x "i" vs "a".