convrtit numeros a leras

3
Cuando se realizan trabajos donde se necesita mostrar al cliente un determinado monto de dinero, tipo factura, recibo, cheque, etc, el cliente desea ver el monto en numeral asi como en literal. Por ejemplo: 877866,50 = ochocientos setenta y siete mil ochocientos sesenta y seis 50/100 Bolivares Pues bien, la siguiente clase a la que llameNumero_a_Letra.java realiza justamente esa operacion, esta extracomentada y trate de hacerla lo mas entendible posible. La logica que se utliza es la siguiente: La clase recibe un numero ej. 123456789,50 valida este numero, si el numero no es valido devuelve NULL Si el numero es valido segun sea este unidad, decena, centena, mil o millon, va clasificando el numero y llama a sus procedimientos correspondientes, estas funciones, son utilizadas en cascada, osea: nuestro numero de ejemplo es 123456789,50, entonces separa en 123456789 y 50, siendo 50 nuestra parte decimal. El numero entero, 123456789 es clasificado = es millon, entonces llama a la funcion getMillones, esta funcion a la vez divide el numero en miles y millones 123456789 = 123 456789 donde 123 corresponde a millones y 456789 a miles entonces la misma funcion llama a las funciones getMiles,getCentenas, getUnidades, segun corresponda, al igual que la funcion getMiles, hace uso de getCentenas, getDecenas getUnidades, lo mismo getCentenas, hace uso de getDececas, getUnidades. Espero se entienda :) import java.util.regex.Pattern; /** * @web http://jc-mouse.blogspot.com/ * @author Mouse */ public class Numero_a_Letra { private final String[] UNIDADES = {"", "un ", "dos ", "tres ", "cuatro ", "cinco ", "seis ", "siete ", "ocho ", "nueve "}; private final String[] DECENAS = {"diez ", "once ", "doce ", "trece ", "catorce ", "quince ", "dieciseis ", "diecisiete ", "dieciocho ", "diecinueve", "veinte ", "treinta ", "cuarenta ", "cincuenta ", "sesenta ", "setenta ", "ochenta ", "noventa "}; private final String[] CENTENAS = {"", "ciento ", "doscientos ", "trecientos ", "cuatrocientos ", "quinientos ", "seiscientos ", "setecientos ", "ochocientos ", "novecientos "}; public Numero_a_Letra() { } public String Convertir(String numero, boolean mayusculas) { String literal = ""; String parte_decimal; //si el numero utiliza (.) en lugar de (,) -> se reemplaza numero = numero.replace(".", ","); //si el numero no tiene parte decimal, se le agrega ,00 if(numero.indexOf(",")==-1){ numero = numero + ",00"; } //se valida formato de entrada -> 0,00 y 999 999 999,00 if (Pattern.matches("\\d{1,9},\\d{1,2}", numero)) { //se divide el numero 0000000,00 -> entero y decimal String Num[] = numero.split(","); //de da formato al numero decimal parte_decimal = Num[1] + "/100 Bolivares."; //se convierte el numero a literal if (Integer.parseInt(Num[0]) == 0) {//si el valor es cero literal = "cero "; } else if (Integer.parseInt(Num[0]) > 999999) {//si es millon literal = getMillones(Num[0]); } else if (Integer.parseInt(Num[0]) > 999) {//si es miles literal = getMiles(Num[0]); } else if (Integer.parseInt(Num[0]) > 99) {//si es centena literal = getCentenas(Num[0]); } else if (Integer.parseInt(Num[0]) > 9) {//si es decena literal = getDecenas(Num[0]); } else {//sino unidades -> 9 literal = getUnidades(Num[0]); } //devuelve el resultado en mayusculas o minusculas if (mayusculas) { return (literal + parte_decimal).toUpperCase(); } else { return (literal + parte_decimal); } } else {//error, no se puede convertir return literal = null; } } /* funciones para convertir los numeros a literales */ private String getUnidades(String numero) {// 1 - 9 //si tuviera algun 0 antes se lo quita -> 09 = 9 o 009=9 String num = numero.substring(numero.length() - 1); return UNIDADES[Integer.parseInt(num)]; } private String getDecenas(String num) {// 99 int n = Integer.parseInt(num); if (n < 10) {//para casos como -> 01 - 09 return getUnidades(num); } else if (n > 19) {//para 20...99 String u = getUnidades(num); if (u.equals("")) { //para 20,30,40,50,60,70,80,90 return DECENAS[Integer.parseInt(num.substring(0, 1)) + 8]; } else { return DECENAS[Integer.parseInt(num.substring(0, 1)) + 8] + "y " + u; } } else {//numeros entre 11 y 19 return DECENAS[n - 10]; } } private String getCentenas(String num) {// 999 o 099 if( Integer.parseInt(num)>99 ){//es centena if (Integer.parseInt(num) == 100) {//caso especial return " cien "; } else { return CENTENAS[Integer.parseInt(num.substring(0, 1))] + getDecenas(num.substring(1)); } }else{//por Ej. 099 //se quita el 0 antes de convertir a decenas

Upload: jbersosa

Post on 20-Jul-2015

1.057 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Convrtit numeros a leras

Cuando se realizan trabajos donde se necesita mostrar al cliente un determinado monto de dinero, tipo factura, recibo, cheque, etc, el cliente desea ver el monto en numeral asi como en literal.

Por ejemplo:

877866,50 = ochocientos setenta y siete mil ochocientos sesenta y seis 50/100 Bolivares

Pues bien, la siguiente clase a la que llameNumero_a_Letra.java realiza justamente esa operacion, esta extracomentada y trate de hacerla lo mas entendible posible.

La logica que se utliza es la siguiente:

La clase recibe un numero ej. 123456789,50valida este numero, si el numero no es valido devuelve NULLSi el numero es valido segun sea este unidad, decena, centena, mil o millon, va clasificando el numero y llama a sus procedimientos correspondientes, estas funciones, son utilizadas en cascada, osea:nuestro numero de ejemplo es 123456789,50, entonces separa en 123456789 y 50, siendo 50 nuestra parte decimal.

El numero entero, 123456789 es clasificado = es millon, entonces llama a la funcion getMillones, esta funcion a la vez divide el numero en miles y millones123456789 = 123 456789 donde 123 corresponde a millones y 456789 a milesentonces la misma funcion llama a las funciones getMiles,getCentenas, getUnidades, segun corresponda, al igual que la funcion getMiles, hace uso de getCentenas, getDecenas getUnidades, lo mismo getCentenas, hace uso de getDececas, getUnidades.

Espero se entienda :)

import java.util.regex.Pattern;/** * @web http://jc-mouse.blogspot.com/ * @author Mouse */public class Numero_a_Letra {

    private final String[] UNIDADES = {"", "un ", "dos ", "tres ", "cuatro ", "cinco ", "seis ", "siete ", "ocho ", "nueve "};    private final String[] DECENAS = {"diez ", "once ", "doce ", "trece ", "catorce ", "quince ", "dieciseis ",        "diecisiete ", "dieciocho ", "diecinueve", "veinte ", "treinta ", "cuarenta ",        "cincuenta ", "sesenta ", "setenta ", "ochenta ", "noventa "};    private final String[] CENTENAS = {"", "ciento ", "doscientos ", "trecientos ", "cuatrocientos ", "quinientos ", "seiscientos ",        "setecientos ", "ochocientos ", "novecientos "};

   public Numero_a_Letra() {   }

    public String Convertir(String numero, boolean mayusculas) {        String literal = "";        String parte_decimal;            //si el numero utiliza (.) en lugar de (,) -> se reemplaza        numero = numero.replace(".", ",");        //si el numero no tiene parte decimal, se le agrega ,00        if(numero.indexOf(",")==-1){            numero = numero + ",00";        }        //se valida formato de entrada -> 0,00 y 999 999 999,00        if (Pattern.matches("\\d{1,9},\\d{1,2}", numero)) {            //se divide el numero 0000000,00 -> entero y decimal            String Num[] = numero.split(",");                        //de da formato al numero decimal            parte_decimal = Num[1] + "/100 Bolivares.";            //se convierte el numero a literal            if (Integer.parseInt(Num[0]) == 0) {//si el valor es cero                literal = "cero ";            } else if (Integer.parseInt(Num[0]) > 999999) {//si es millon                literal = getMillones(Num[0]);            } else if (Integer.parseInt(Num[0]) > 999) {//si es miles                literal = getMiles(Num[0]);            } else if (Integer.parseInt(Num[0]) > 99) {//si es centena                literal = getCentenas(Num[0]);            } else if (Integer.parseInt(Num[0]) > 9) {//si es decena                literal = getDecenas(Num[0]);            } else {//sino unidades -> 9                literal = getUnidades(Num[0]);            }            //devuelve el resultado en mayusculas o minusculas            if (mayusculas) {                return (literal + parte_decimal).toUpperCase();            } else {                return (literal + parte_decimal);            }        } else {//error, no se puede convertir            return literal = null;        }    }

    /* funciones para convertir los numeros a literales */

    private String getUnidades(String numero) {// 1 - 9        //si tuviera algun 0 antes se lo quita -> 09 = 9 o 009=9        String num = numero.substring(numero.length() - 1);        return UNIDADES[Integer.parseInt(num)];    }

    private String getDecenas(String num) {// 99                                int n = Integer.parseInt(num);        if (n < 10) {//para casos como -> 01 - 09            return getUnidades(num);        } else if (n > 19) {//para 20...99            String u = getUnidades(num);            if (u.equals("")) { //para 20,30,40,50,60,70,80,90                return DECENAS[Integer.parseInt(num.substring(0, 1)) + 8];            } else {                return DECENAS[Integer.parseInt(num.substring(0, 1)) + 8] + "y " + u;            }        } else {//numeros entre 11 y 19            return DECENAS[n - 10];        }    }

    private String getCentenas(String num) {// 999 o 099        if( Integer.parseInt(num)>99 ){//es centena            if (Integer.parseInt(num) == 100) {//caso especial                return " cien ";            } else {                 return CENTENAS[Integer.parseInt(num.substring(0, 1))] + getDecenas(num.substring(1));            }         }else{//por Ej. 099             //se quita el 0 antes de convertir a decenas

Page 2: Convrtit numeros a leras

            return getDecenas(Integer.parseInt(num)+"");                    }            }

    private String getMiles(String numero) {// 999 999        //obtiene las centenas        String c = numero.substring(numero.length() - 3);        //obtiene los miles        String m = numero.substring(0, numero.length() - 3);        String n="";        //se comprueba que miles tenga valor entero        if (Integer.parseInt(m) > 0) {            n = getCentenas(m);                       return n + "mil " + getCentenas(c);        } else {            return "" + getCentenas(c);        }

    }

    private String getMillones(String numero) { //000 000 000                //se obtiene los miles        String miles = numero.substring(numero.length() - 6);        //se obtiene los millones        String millon = numero.substring(0, numero.length() - 6);        String n = "";        if(millon.length()>1){            n = getCentenas(millon) + "millones ";        }else{            n = getUnidades(millon) + "millon ";        }        return n + getMiles(miles);            }}

Esta clase, recibe un numero de 0,00 a 999999999.00 en formato String, el separador decimal puede ser un punto (.) o una coma (,), ademas tiene un parametro booleano "mayusculas" el cual sea verdadero (true) o falso (false), retorna el resultado en mayusculas o minusculas, esta clase no acepta numeros negativos ni tampoco numero mayores o iguales a mil millones, aunque claro trate de escribir esta clase para que sea facilmente comprensible y asi pueda ser ampliado o modificado segun sus necesidades.

La forma de llamara a esta clase es:

Numero_a_Letra NumLetra = new Numero_a_Letra();String numero = "20004.70";System.out.println( numero  + " literal = "  + NumLetra.Convertir(numero,true));

y probando para un rango mayor de numeros tenemos como resultado:

352822,50 literal = TRECIENTOS CINCUENTA Y DOS MIL OCHOCIENTOS VEINTE Y DOS 50/100 BOLIVARES.370,50 literal = trecientos setenta 50/100 Bolivares.74883,50 literal = SETENTA Y CUATRO MIL OCHOCIENTOS OCHENTA Y TRES 50/100 BOLIVARES.354801,50 literal = trecientos cincuenta y cuatro mil ochocientos un 50/100 Bolivares.12,50 literal = DOCE 50/100 BOLIVARES.511812060,50 literal = QUINIENTOS ONCE MILLONES OCHOCIENTOS DOCE MIL SESENTA 50/100 BOLIVARES.285364,50 literal = doscientos ochenta y cinco mil trecientos sesenta y cuatro 50/100 Bolivares.97,50 literal = NOVENTA Y SIETE 50/100 BOLIVARES.882,50 literal = OCHOCIENTOS OCHENTA Y DOS 50/100 BOLIVARES.28,50 literal = VEINTE Y OCHO 50/100 BOLIVARES.395362869,50 literal = TRECIENTOS NOVENTA Y CINCO MILLONES TRECIENTOS SESENTA Y DOS MIL OCHOCIENTOS SESENTA Y NUEVE 50/100 BOLIVARES.687611,50 literal = SEISCIENTOS OCHENTA Y SIETE MIL SEISCIENTOS ONCE 50/100 BOLIVARES.46,50 literal = CUARENTA Y SEIS 50/100 BOLIVARES.394625,50 literal = trecientos noventa y cuatro mil seiscientos veinte y cinco 50/100 Bolivares.686671871,50 literal = seiscientos ochenta y seis millones seiscientos setenta y un mil ochocientos setenta y un 50/100 Bolivares.860233047,50 literal = OCHOCIENTOS SESENTA MILLONES DOSCIENTOS TREINTA Y TRES MIL CUARENTA Y SIETE 50/100 BOLIVARES.656477159,50 literal = SEISCIENTOS CINCUENTA Y SEIS MILLONES CUATROCIENTOS SETENTA Y SIETE MIL CIENTO CINCUENTA Y NUEVE 50/100 BOLIVARES.99037,50 literal = NOVENTA Y NUEVE MIL TREINTA Y SIETE 50/100 BOLIVARES.159180,50 literal = ciento cincuenta y nueve mil ciento ochenta 50/100 Bolivares.69993,50 literal = SESENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y TRES 50/100 BOLIVARES.76,50 literal = setenta y seis 50/100 Bolivares.74,50 literal = setenta y cuatro 50/100 Bolivares.4,50 literal = cuatro 50/100 Bolivares.572356,50 literal = QUINIENTOS SETENTA Y DOS MIL TRECIENTOS CINCUENTA Y SEIS 50/100 BOLIVARES.85,50 literal = OCHENTA Y CINCO 50/100 BOLIVARES.678977004,50 literal = seiscientos setenta y ocho millones novecientos setenta y siete mil cuatro 50/100 Bolivares.311275,50 literal = TRECIENTOS ONCE MIL DOSCIENTOS SETENTA Y CINCO 50/100 BOLIVARES.888,50 literal = OCHOCIENTOS OCHENTA Y OCHO 50/100 BOLIVIANOS.861740125,50 literal = OCHOCIENTOS SESENTA Y UN MILLONES SETECIENTOS CUARENTA MIL CIENTO VEINTE Y CINCO 50/100 BOLIVARES.370246,50 literal = trecientos setenta mil doscientos cuarenta y seis 50/100 Bolivares.986444,50 literal = novecientos ochenta y seis mil cuatrocientos cuarenta y cuatro 50/100 Bolivares.202,50 literal = DOSCIENTOS DOS 50/100 BOLIVARES.407295,50 literal = CUATROCIENTOS SIETE MIL DOSCIENTOS NOVENTA Y CINCO 50/100 BOLIVARES.522,50 literal = QUINIENTOS VEINTE Y DOS 50/100 BOLIVARES.378878653,50 literal = TRECIENTOS SETENTA Y OCHO MILLONES OCHOCIENTOS SETENTA Y OCHO MIL SEISCIENTOS CINCUENTA Y TRES 50/100 BOLIVARES.712142,50 literal = SETECIENTOS DOCE MIL CIENTO CUARENTA Y DOS 50/100 BOLIVARES.588737075,50 literal = QUINIENTOS OCHENTA Y OCHO MILLONES SETECIENTOS TREINTA Y SIETE MIL SETENTA Y CINCO 50/100 BOLIVARES.946540,50 literal = novecientos cuarenta y seis mil quinientos cuarenta 50/100 Bolivares.34667457,50 literal = treinta y cuatro millones seiscientos sesenta y siete mil cuatrocientos cincuenta y siete 50/100 Bolivares.391874,50 literal = trecientos noventa y un mil ochocientos setenta y cuatro 50/100 Bolivares.745,50 literal = SETECIENTOS CUARENTA Y CINCO 50/100 BOLIVARES.670024,50 literal = seiscientos setenta mil veinte y cuatro 50/100 Bolivares.703029,50 literal = setecientos tres mil veinte y nueve 50/100 Bolivares.745,50 literal = setecientos cuarenta y cinco 50/100 Bolivares.975415558,50 literal = NOVECIENTOS SETENTA Y CINCO MILLONES CUATROCIENTOS QUINCE MIL QUINIENTOS CINCUENTA Y OCHO 50/100 BOLIVARES.294,50 literal = DOSCIENTOS NOVENTA Y CUATRO 50/100 BOLIVARES.559794,50 literal = quinientos cincuenta y nueve mil setecientos noventa y cuatro 50/100 Bolivares.23,50 literal = veinte y tres 50/100 Bolivares.586335,50 literal = QUINIENTOS OCHENTA Y SEIS MIL TRECIENTOS TREINTA Y CINCO 50/100 BOLIVARES.14174901,50 literal = catorce millones ciento setenta y cuatro mil novecientos un 50/100 Bolivares.529551002,50 literal = quinientos veinte y nueve millones quinientos cincuenta y un mil dos 50/100 Bolivares.930,50 literal = NOVECIENTOS TREINTA 50/100 BOLIVIANOS.581617,50 literal = quinientos ochenta y un mil seiscientos diecisiete 50/100 Bolivianos.44,50 literal = CUARENTA Y CUATRO 50/100 BOLIVARES.727302804,50 literal = SETECIENTOS VEINTE Y SIETE MILLONES TRECIENTOS DOS MIL OCHOCIENTOS CUATRO 50/100 BOLIVARES.66,50 literal = SESENTA Y SEIS 50/100 BOLIVARES.34618398,50 literal = TREINTA Y CUATRO MILLONES SEISCIENTOS DIECIOCHO MIL TRECIENTOS NOVENTA Y OCHO 50/100 Bolivares.477354079,50 literal = CUATROCIENTOS SETENTA Y SIETE MILLONES TRECIENTOS CINCUENTA Y CUATRO MIL SETENTA Y NUEVE 50/100 BOLIVARES.813,50 literal = OCHOCIENTOS TRECE 50/100 BOLIVARES.634888270,50 literal = SEISCIENTOS TREINTA Y CUATRO MILLONES OCHOCIENTOS OCHENTA Y OCHO MIL DOSCIENTOS SETENTA 50/100 BOLIVARES.219544,50 literal = DOSCIENTOS DIECINUEVEMIL QUINIENTOS CUARENTA Y CUATRO 50/100 BOLIVARES.51,50 literal = cincuenta y un 50/100 Bolivares.435640,50 literal = CUATROCIENTOS TREINTA Y CINCO MIL SEISCIENTOS CUARENTA 50/100 BOLIVARES.557896,50 literal = quinientos cincuenta y siete mil ochocientos noventa y seis 50/100 Bolivares.36,50 literal = TREINTA Y SEIS 50/100 BOLIVARES.710,50 literal = SETECIENTOS DIEZ 50/100 BOLIVARES.850,50 literal = OCHOCIENTOS CINCUENTA 50/100 BOLIVARES.230498844,50 literal = doscientos treinta millones cuatrocientos noventa y ocho mil ochocientos cuarenta y cuatro 50/100 Bolivares.104296,50 literal = ciento cuatro mil doscientos noventa y seis 50/100 Bolivares.1,50 literal = UN 50/100 BOLIVARES.-0100100,70 literal = null003,70 literal = tres 70/100 Bolivares.28,745 literal = null

Page 3: Convrtit numeros a leras

0,5 literal = CERO 5/100 BOLIVARES.999999999 literal = NOVECIENTOS NOVENTA Y NUEVE MILLONES NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE 00/100 BOLIVARES.9999999999 literal = null48803770 literal = cuarenta y ocho millones ochocientos tres mil setecientos setenta 00/100 Bolivares.20004.70 literal = VEINTE MIL CUATRO 70/100 BOLIVARES.