Friday, September 12, 2008

Rappresentazione di un numero in lettere

Oggi mi sono trovato a dover stampare un bollettino postale per un pagamento... per cui ho avuto il solito problema di rappresentare un valore numerico in lettere, cosa che serve anche per rappresentare l'importo su assegni bancari.

Ecco qua il codice Java che realizza la cosa...

Nota: la classe org.apache.commons.lang.StringUtils; e' fornita dalla libreria
di utilita' Apache Commons Lang (http://commons.apache.org/lang/)
per cui per compilare e eseguire la classe ricordatevi di aggiungere commons-lang.jar
al vostro classpath.



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigDecimal;

import org.apache.commons.lang.StringUtils;

public class CharsNumber {

private BigDecimal v;


public CharsNumber(BigDecimal v) {
super();
this.v = v;
}

@Override
public String toString() {
return toString(v);
}

private static String toString(BigDecimal Valore) {
String result = ""; // risultato
String[] lettere = { "", "uno", "due", "tre", "quattro", "cinque",
"sei", "sette", "otto", "nove", "dieci", "undici", "dodici",
"tredici", "quattordici", "quindici", "sedici", "diciassette",
"diciotto", "diciannove", "venti", "trenta", "quaranta",
"cinquanta", "sessanta", "settanta", "ottanta", "novanta" };

String valore = "" + Valore.abs();
String resto = "/00";
valore = valore.replace(',', '.');
int k = valore.indexOf('.');
if (k >= 0) // l'importo รจ decimale
{
resto = "/" + valore.substring(k + 1);
if (resto.length() == 2) resto += "0";
if (resto.length() > 3) resto = resto.substring(0, 3);
valore = valore.substring(0, k);
}
if (valore == "0") // importo zero finisce subito
{
result += "zero";
valore = "";
}
k = valore.length() % 3;
// normalizzo la cifra in modo da poter avere dei gruppi di tre
if (k > 0) {
valore = StringUtils.leftPad(valore, valore.length() + (3 - k), '0');
}
k = -1;
while (valore.length() > 0) {
String parziale = "";
// mangia tre caratteri a destra
char[] c = valore.substring(valore.length() - 3,valore.length()).toCharArray();
valore = valore.substring(0, valore.length() - 3);
k++;
for (int j = 0; j < 3; j++) {
int x = Integer.parseInt(new Character(c[j]).toString());
if (x != 0) {
if (j == 0)
parziale += (x == 1) ? "cento" : lettere[x] + "cento";
if (j == 1)
parziale += (x < 3) ? lettere[x * 10] : lettere[x + 18];
if (j == 2) {
boolean dieci = (!parziale.endsWith("dieci"));
if (!dieci) {
parziale = parziale.substring(0, parziale.length() - 5);
}
parziale += (dieci) ? lettere[x] : lettere[x + 10];
if (dieci) {

for (String s : new String[] { "ao", "au", "io",
"iu" }) {
int i = parziale.indexOf(s);
String t = s.substring(1);
while (i >= 0) {
parziale = parziale.substring(0, i)
+ parziale.substring(i + 1);
i = parziale.indexOf(s);
}
}
} // if (dieci)
} // if (j==2)
} // if (j != 0)
} // for j
if (parziale.length() > 0) {
String[] mille = { "uno", "mille", "unmilione", "unmiliardo",
"millemiliardi", "unmilionedimiliardi",
"unmiliardodimiliardi", "", "mila", "milioni",
"miliardi", "milamiliardi", "milionidimiliardi",
"miliardidimiliardi" };
int j = k + 7;
if (parziale.equals("uno")) {
parziale = "";
j = k;
}
if (j > mille.length - 1)
result = "valore fuori dei limiti";
else
result = (k == 0) ? mille[j] + parziale : parziale
+ mille[j] + result;
}
} // while
result += resto;
if (Valore.doubleValue() < 0)
result = "meno" + result;
return result;

}

public static void main(String[] args) throws Exception {

BufferedReader console = new BufferedReader(
new InputStreamReader(java.lang.System.in)
);

java.lang.System.out.println("Numero: ");

String line = "";
while ((line = console.readLine()) != null) {
BigDecimal d = new BigDecimal(line);
java.lang.System.out.println("Lettere: " + new CharsNumber(d));
java.lang.System.out.print("Numero: ");
}

}

}


About Me

Milano, Italy
Software Architect and Software Solution Advisor