Lo he necesitado hoy, tal vez tu también puedas necesitarlo:
public class Literal
{
//valor nos dice si es que es unidad de miles
private static String unidades(int num, boolean valor)
{
String res = "";
switch(num)
{
case 1: res = valor?"un":"uno"; break;
case 2: res = "dos"; break;
case 3: res = "tres"; break;
case 4: res = "cuatro"; break;
case 5: res = "cinco"; break;
case 6: res = "seis"; break;
case 7: res = "siete"; break;
case 8: res = "ocho"; break;
case 9: res = "nueve"; break;
}
return res;
}
//valor nos dice si es que es decena de miles
private static String decenas(int num, boolean valor)
{
String res = "";
if (num < 10)
{
res = unidades(num, false);
}
else if (num == 10)
res = "diez";
else if (num == 11)
res = "once";
else if (num == 12)
res = "doce";
else if (num == 13)
res = "trece";
else if (num == 14)
res = "catorce";
else if (num == 15)
res = "quince";
else if (num >= 16 && num < 20)
res = "dieci"+unidades(num-10, valor);
else if (num >= 20 && num < 30)
res = "veint"+(num-20==0?"e":"i"+unidades(num-20, valor));
else if (num >= 30 && num < 40)
res = "treinta"+(num-30==0?"":" y "+unidades(num-30, valor));
else if (num >= 40 && num < 50)
res = "cuarenta"+(num-40==0?"":" y "+unidades(num-40, valor));
else if (num >= 50 && num < 60)
res = "cincuenta"+(num-50==0?"":" y "+unidades(num-50, valor));
else if (num >= 60 && num < 70)
res = "sesenta"+(num-60==0?"":" y "+unidades(num-60, valor));
else if (num >= 70 && num < 80)
res = "setenta"+(num-70==0?"":" y "+unidades(num-70, valor));
else if (num >= 80 && num < 90)
res = "ochenta"+(num-80==0?"":" y "+unidades(num-80, valor));
else if (num >= 90 && num < 100)
res = "noventa"+(num-90==0?"":" y "+unidades(num-90, valor));
return res;
}
//valor nos dice si es que es centena de miles
private static String centenas(int num, boolean valor)
{
String res = "";
if (num < 100)
res = decenas(num,valor);
else if (num>=100 && num < 200)
res = "cien"+(num-100==0?"":"to "+decenas(num-100,valor));
else if (num>=200 && num < 300)
res = "doscientos"+(num-200==0?"":" "+decenas(num-200,valor));
else if (num>=300 && num < 400)
res = "trescientos"+(num-300==0?"":" "+decenas(num-300,valor));
else if (num>=400 && num < 500)
res = "cuatrocientos"+(num-400==0?"":" "+decenas(num-400,valor));
else if (num>=500 && num < 600)
res = "quinientos"+(num-500==0?"":" "+decenas(num-500,valor));
else if (num>=600 && num < 700)
res = "seiscientos"+(num-600==0?"":" "+decenas(num-600,valor));
else if (num>=700 && num < 800)
res = "setecientos"+(num-700==0?"":" "+decenas(num-700,valor));
else if (num>=800 && num < 900)
res = "ochocientos"+(num-800==0?"":" "+decenas(num-800,valor));
else if (num>=900 && num < 1000)
res = "novecientos"+(num-900==0?"":" "+decenas(num-900,valor));
return res;
}
private static String unidadMiles(int num)
{
String res ="";
if (num<1000)
res = centenas(num,false);
else if(num >= 1000 && num < 2000)
res = "mil"+centenas(num%1000, false);
else
res = centenas(num/1000, true)+" mil "+centenas(num%1000, false);
return res;
}
private static String millon(int num)
{
String res = "";
if (num < 1000000)
res = unidadMiles(num);
else if (num == 1000000)
res = "Un millón ";
else
res = unidades(num/1000000, true)+" millones "+unidadMiles(num%1000000);
return res;
}
public static String convertir(int num)
{
if (num==0)
return "cero";
else if (num > 0 && num <= 9999999)
{
String res = millon(num);
char primero = res.charAt(0);
return String.valueOf(primero).toUpperCase()+res.substring(1);
}
else return "FUERA DEL RANGO!!";
}
public static String getMonto(double valor){
String numero = String.valueOf(valor);
int punto = numero.indexOf(".");
String entero = convertir(Integer.parseInt(numero.substring(0,punto)));
String decimal =numero.substring(punto+1);
return entero+" "+decimal+"/100";
}
public static String getMonto(Double valor){
return getMonto(valor.doubleValue());
}
public static void main(String ar[])
{
System.out.println(convertir(1384388));
}
}
Palabras clave: código útil, java
Comentarios
Bueno, recuero haber dado este ejericio a varios alumnos, tratare de buscar sus soluciones, habian algunas muy interesantes :) y más cortas.
Es necesario para facturas :)
SALUDOS
Lucha de Titanes .........
......... Bueno ya enserio,
Esta version esta en base a la version presentada por Cristian, no diria que es mejor (porque hay unas cuantas cosas en la version de Cristian que sinceramente no se me habrian ocurrido) solo es un poco diferente.
public class Literal_version2 { //valor nos dice si es que es unidad de miles private static String unidades(int num, boolean valor) { String res = ""; switch(num) { case 1: res = valor?"un":"uno"; break; case 2: res = "dos"; break; case 3: res = "tres"; break; case 4: res = "cuatro"; break; case 5: res = "cinco"; break; case 6: res = "seis"; break; case 7: res = "siete"; break; case 8: res = "ocho"; break; case 9: res = "nueve"; break; } return res; } //valor nos dice si es que es decena de miles private static String decenas(int num, boolean valor) { String res = ""; if (num < 10) res = unidades(num, false); else switch(num) { case 10: res = "diez"; break; case 11: res = "once"; break; case 12: res = "doce"; break; case 13: res = "trece"; break; case 14: res = "catorce"; break; case 15: res = "quince"; break; default : { if (num < 20) res = "dieci"+unidades(num-10, valor); else if (num < 30) res = "veint"+(num-20==0?"e":"i"+unidades(num-20, valor)); else if (num < 40) res = "treinta"+(num-30==0?"":" y "+unidades(num-30, valor)); else if (num < 50) res = "cuarenta"+(num-40==0?"":" y "+unidades(num-40, valor)); else if (num < 60) res = "cincuenta"+(num-50==0?"":" y "+unidades(num-50, valor)); else if (num < 70) res = "sesenta"+(num-60==0?"":" y "+unidades(num-60, valor)); else if (num < 80) res = "setenta"+(num-70==0?"":" y "+unidades(num-70, valor)); else if (num < 90) res = "ochenta"+(num-80==0?"":" y "+unidades(num-80, valor)); else if (num < 100) res = "noventa"+(num-90==0?"":" y "+unidades(num-90, valor)); } } return res; } //valor nos dice si es que es centena de miles private static String centenas(int num, boolean valor) { String res = ""; if (num < 100) res = decenas(num,valor); else if (num < 200) res = "cien"+(num-100==0?"":"to "+decenas(num-100,valor)); else if (num < 300) res = "doscientos"+(num-200==0?"":" "+decenas(num-200,valor)); else if (num < 400) res = "trescientos"+(num-300==0?"":" "+decenas(num-300,valor)); else if (num < 500) res = "cuatrocientos"+(num-400==0?"":" "+decenas(num-400,valor)); else if (num < 600) res = "quinientos"+(num-500==0?"":" "+decenas(num-500,valor)); else if (num < 700) res = "seiscientos"+(num-600==0?"":" "+decenas(num-600,valor)); else if (num < 800) res = "setecientos"+(num-700==0?"":" "+decenas(num-700,valor)); else if (num < 900) res = "ochocientos"+(num-800==0?"":" "+decenas(num-800,valor)); else if (num < 1000) res = "novecientos"+(num-900==0?"":" "+decenas(num-900,valor)); return res; } private static String unidadMiles(int num) { String res =""; if (num<1000) res = centenas(num,false); else if(num < 2000) res = "mil"+centenas(num%1000, false); else res = centenas(num/1000, true)+" mil "+centenas(num%1000, false); return res; } private static String millon(int num) { String res = ""; if (num < 1000000) res = unidadMiles(num); else if (num < 2000000) res = "Un millon "+unidadMiles(num%1000000); else res = unidades(num/1000000, true)+" millones "+unidadMiles(num%1000000); return res; } public static String convertir(int num) { if (num==0) return "cero"; else if (num <= 9999999) { String res = millon(num); char primero = res.charAt(0); return String.valueOf(primero).toUpperCase()+res.substring(1); } else return "FUERA DEL RANGO!!"; } public static void main(String ar[]) { System.out.println(convertir(1384388)); System.out.println(convertir(6666668)); System.out.println(convertir(1010101)); System.out.println(convertir(4567)); System.out.println(convertir(27)); } }#2. Alumno Cristian, esa es su tarea :P
Ya en serio, tratare de buscar las soluciones y proponer alguna otra :).
Bueno el ejercicio me parecio interesante, porque vi la propuesta del problema cuando estaba en inf-135 y nunca me anime a hacerla, aparte que sabía mucho, pero mucho menos de programación que ahora, en realidad nada estamos deacuerdo no....??
El programa que te devuelve un número entero, positivo o negativo, ingresado por teclado en literal soporta hasta un número de 9 dígitos porque ya me dio flojera hacer cifras de miles de millones y para un número mayor a 11 tendría que usar long....pero funciona, no es de lo más eficiente, dudo que sea eficiente pero me emocioné con el ejercicio.....saludos.
import java.util.InputMismatchException; import java.util.Scanner; /** public class Ejercicio { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int dato = 0; while( scan.hasNext() ){ try{ dato = scan.nextInt(); if( dato < 0 ){ String negativo = ""+dato; negativo = negativo.substring(1); int datoPositivo = Integer.parseInt(negativo); System.out.println("menos "+darLiteral(datoPositivo)); } else System.out.println(darLiteral(dato)); }catch(InputMismatchException exc){ System.out.println("Numero demasiado grande "+exc); dato = scan.nextInt(); } } } private static int cantidadDigitos( int n ){ int cantidad = 1; while( n >= 10 ){ cantidad += 1; n /=10; } return cantidad; } public static String darLiteral( int n ){ String literal = ""; int cantDigitos = cantidadDigitos(n); if(cantDigitos > 9) System.out.println("El número es demasiado grande!!"); else switch(cantDigitos){ case 1: literal = darUnidades(n); break; case 2: literal = darDecenas(n); break; case 3: literal = darCentenas(n); break; case 4: literal = darMilesimas(n); break; case 5: literal = darDecenasMil(n); break; case 6: literal = darCentenasMil(n); break; default: literal = darMillonesimas(n); } return literal; } private static String darUnidades( int n ){ String unidad = ""; switch(n){ case 0: unidad = "cero"; break; case 1: unidad = "uno"; break; case 2: unidad = "dos"; break; case 3: unidad = "tres"; break; case 4: unidad = "cuatro"; break; case 5: unidad = "cinco"; break; case 6: unidad = "seis"; break; case 7: unidad = "siete"; break; case 8: unidad = "ocho"; break; case 9: unidad = "nueve"; break; } return unidad; } private static String darDecenas( int n ){ String decena = ""; int unidad = n%10; boolean exacto = (n%10 == 0); if( (n >= 10) && (n <= 15) ) switch(n){ case 10: decena = "diez"; break; case 11: decena = "once"; break; case 12: decena = "doce"; break; case 13: decena = "trece"; break; case 14: decena = "catorce"; break; case 15: decena = "quince"; break; } else if( (n >= 16) && (n <= 19) ) decena = "dieci"+darUnidades(unidad); else if( exacto ) switch( n ){ case 20: decena = "veinte"; break; case 30: decena = "treinta"; break; case 40: decena = "cuarenta"; break; case 50: decena = "cincuenta"; break; case 60: decena = "sesenta"; break; case 70: decena = "setenta"; break; case 80: decena = "ochenta"; break; case 90: decena = "noventa"; break; } else{ int decenaAux = n/10; switch( decenaAux ){ case 2: decena = "veinti"+darUnidades(unidad); break; case 3: decena = "treinta y "+darUnidades(unidad); break; case 4: decena = "cuarenta y "+darUnidades(unidad); break; case 5: decena = "cincuenta y "+darUnidades(unidad); break; case 6: decena = "sesenta y "+darUnidades(unidad); break; case 7: decena = "setenta y "+darUnidades(unidad); break; case 8: decena = "ochenta y "+darUnidades(unidad); break; case 9: decena = "noventa y "+darUnidades(unidad); break; } } return decena; } private static String darCentenas( int n ){ String centena = ""; boolean exacto = (n%100 == 0); int resto = n%100; int div = n/100; if( div != 1 && div != 5 && div != 7 && div != 9 ){ String cad = darUnidades(div)+"cientos "; if( exacto ) centena = cad; else if( resto > 9 ) centena = cad+darDecenas(resto); else centena = cad+darUnidades(resto); } else switch( div ){ case 1: if( exacto ) centena = "cien"; else if( resto > 9 ) centena = "ciento "+darDecenas(resto); else centena = "ciento "+darUnidades(resto); break; case 5: centena = "quinientos "; if( exacto ) centena += ""; else if( resto > 9 ) centena += darDecenas(resto); else centena += darUnidades(resto); break; case 7: centena = "setecientos "; if( exacto ) centena += ""; else if( resto > 9 ) centena += darDecenas(resto); else centena += darUnidades(resto); break; case 9: centena = "novecientos "; if( exacto ) centena += ""; else if( resto > 9 ) centena += darDecenas(resto); else centena += darUnidades(resto); break; } return centena; } private static String darMilesimas( int n ){ String res = ""; int milesima = n/1000; String prefijo = ""; int resto = n%1000; boolean exacto = (n%1000 == 0); if( milesima == 1 ) prefijo = " mil "; else prefijo = darUnidades(milesima)+" mil "; if( exacto ) res = prefijo; else switch(cantidadDigitos(resto)){ case 1: res = prefijo+darUnidades(resto); break; case 2: res = prefijo+darDecenas(resto); break; default: res = prefijo+darCentenas(resto); break; } return res; } private static String darDecenasMil( int n ){ String res = ""; int decMil = n/1000; String prefijo = darDecenas(decMil)+" mil "; int resto = n%1000; boolean exacto = (n%1000 == 0); if( exacto ) res = prefijo; else switch(cantidadDigitos(resto)){ case 1: res = prefijo+darUnidades(resto); break; case 2: res = prefijo+darDecenas(resto); break; default: res = prefijo+darCentenas(resto); break; } return res; } private static String darCentenasMil( int n ){ String res = ""; int centMil = n/1000; String prefijo = darCentenas(centMil)+" mil "; int resto = n%1000; boolean exacto = (n%1000 == 0); if( exacto ) res = prefijo; else switch(cantidadDigitos(resto)){ case 1: res = prefijo+darUnidades(resto); break; case 2: res = prefijo+darDecenas(resto); break; case 3: res = prefijo+darCentenas(resto); break; default: res = prefijo+darDecenasMil(resto); break; } return res; } private static String darMillonesimas( int n ){ String res = ""; int millon = n/1000000; String prefijo = ""; int resto = n%1000000; boolean exacto = (n%1000000 == 0); if( millon == 1 ) prefijo = "un millón "; else switch(cantidadDigitos(millon)){ case 1: prefijo = darUnidades(millon)+" millones "; break; case 2: prefijo = darDecenas(millon)+" millones "; break; case 3: prefijo = darCentenas(millon)+" millones "; break; } if( exacto ) res = prefijo; else switch(cantidadDigitos(resto)){ case 1: res = prefijo+darUnidades(resto); break; case 2: res = prefijo+darDecenas(resto); break; case 3: res = prefijo+darCentenas(resto); break; case 4: res = prefijo+darDecenasMil(resto); break; default: res = prefijo+darCentenasMil(resto); break; } return res; } }Lo siento pero creo que no cargo todo el código aquí les paso lo que faltaba
centena += darUnidades(resto); break; case 9: centena = "novecientos "; if( exacto ) centena += ""; else if( resto > 9 ) centena += darDecenas(resto); else centena += darUnidades(resto); break; } return centena; } private static String darMilesimas( int n ){ String res = ""; int milesima = n/1000; String prefijo = ""; int resto = n%1000; boolean exacto = (n%1000 == 0); if( milesima == 1 ) prefijo = " mil "; else prefijo = darUnidades(milesima)+" mil "; if( exacto ) res = prefijo; else switch(cantidadDigitos(resto)){ case 1: res = prefijo+darUnidades(resto); break; case 2: res = prefijo+darDecenas(resto); break; default: res = prefijo+darCentenas(resto); break; } return res; } private static String darDecenasMil( int n ){ String res = ""; int decMil = n/1000; String prefijo = darDecenas(decMil)+" mil "; int resto = n%1000; boolean exacto = (n%1000 == 0); if( exacto ) res = prefijo; else switch(cantidadDigitos(resto)){ case 1: res = prefijo+darUnidades(resto); break; case 2: res = prefijo+darDecenas(resto); break; default: res = prefijo+darCentenas(resto); break; } return res; } private static String darCentenasMil( int n ){ String res = ""; int centMil = n/1000; String prefijo = darCentenas(centMil)+" mil "; int resto = n%1000; boolean exacto = (n%1000 == 0); if( exacto ) res = prefijo; else switch(cantidadDigitos(resto)){ case 1: res = prefijo+darUnidades(resto); break; case 2: res = prefijo+darDecenas(resto); break; case 3: res = prefijo+darCentenas(resto); break; default: res = prefijo+darDecenasMil(resto); break; } return res; } private static String darMillonesimas( int n ){ String res = ""; int millon = n/1000000; String prefijo = ""; int resto = n%1000000; boolean exacto = (n%1000000 == 0); if( millon == 1 ) prefijo = "un millón "; else switch(cantidadDigitos(millon)){ case 1: prefijo = darUnidades(millon)+" millones "; break; case 2: prefijo = darDecenas(millon)+" millones "; break; case 3: prefijo = darCentenas(millon)+" millones "; break; } if( exacto ) res = prefijo; else switch(cantidadDigitos(resto)){ case 1: res = prefijo+darUnidades(resto); break; case 2: res = prefijo+darDecenas(resto); break; case 3: res = prefijo+darCentenas(resto); break; case 4: res = prefijo+darDecenasMil(resto); break; default: res = prefijo+darCentenasMil(resto); break; } return res; } }