Skip to content

Instantly share code, notes, and snippets.

@ValentinTT
Created December 12, 2023 12:45
Show Gist options
  • Save ValentinTT/ad1866f5329948a03dcab8b59c43fcc7 to your computer and use it in GitHub Desktop.
Save ValentinTT/ad1866f5329948a03dcab8b59c43fcc7 to your computer and use it in GitHub Desktop.
Convert and integer to the text version in Spanish
/*
* File: Wordify.java
* Author: ValentinTT
* Created on: 12/12/2023
* Description: Convert an integer to the text version in Spanish.
* License: MIT
*/
import java.util.HashMap;
public class Wordify {
private static final HashMap<Integer, String> CENTENAS = new HashMap<>();
private static final HashMap<Integer, String> DECENAS = new HashMap<>();
private static final HashMap<Integer, String> UNIDADES = new HashMap<>();
private static final HashMap<Integer, String> CASOS_MENORES_TREINTA = new HashMap<>();
static {
CENTENAS.put(0, "");
CENTENAS.put(1, "CIEN");
CENTENAS.put(2, "DOSCIENTOS");
CENTENAS.put(3, "TRESCIENTOS");
CENTENAS.put(4, "CUATROCIENTOS");
CENTENAS.put(5, "QUINIENTOS");
CENTENAS.put(6, "SEISCIENTOS");
CENTENAS.put(7, "SETECIENTOS");
CENTENAS.put(8, "OCHOCIENTOS");
CENTENAS.put(9, "NOVECIENTOS");
DECENAS.put(0, "");
DECENAS.put(1, "DIEZ");
DECENAS.put(2, "VEINTE");
DECENAS.put(3, "TREINTA");
DECENAS.put(4, "CUARENTA");
DECENAS.put(5, "CINCUENTA");
DECENAS.put(6, "SESENTA");
DECENAS.put(7, "SETENTA");
DECENAS.put(8, "OCHENTA");
DECENAS.put(9, "NOVENTA");
UNIDADES.put(0, "");
UNIDADES.put(1, "UNO");
UNIDADES.put(2, "DOS");
UNIDADES.put(3, "TRES");
UNIDADES.put(4, "CUATRO");
UNIDADES.put(5, "CINCO");
UNIDADES.put(6, "SEIS");
UNIDADES.put(7, "SIETE");
UNIDADES.put(8, "OCHO");
UNIDADES.put(9, "NUEVE");
CASOS_MENORES_TREINTA.put(11, "ONCE");
CASOS_MENORES_TREINTA.put(12, "DOCE");
CASOS_MENORES_TREINTA.put(13, "TRECE");
CASOS_MENORES_TREINTA.put(14, "CATORCE");
CASOS_MENORES_TREINTA.put(15, "QUINCE");
CASOS_MENORES_TREINTA.put(16, "DIECISÉIS");
CASOS_MENORES_TREINTA.put(17, "DIECISIETE");
CASOS_MENORES_TREINTA.put(18, "DIECIOCHO");
CASOS_MENORES_TREINTA.put(19, "DIECINUEVE");
CASOS_MENORES_TREINTA.put(20, "VEINTE");
CASOS_MENORES_TREINTA.put(21, "VEINTIUNO");
CASOS_MENORES_TREINTA.put(22, "VEINTIDÓS");
CASOS_MENORES_TREINTA.put(23, "VEINTITRES");
CASOS_MENORES_TREINTA.put(24, "VEINTICUATRO");
CASOS_MENORES_TREINTA.put(25, "VEINTICINCO");
CASOS_MENORES_TREINTA.put(26, "VEINTISEIS");
CASOS_MENORES_TREINTA.put(27, "VEINTISIETE");
CASOS_MENORES_TREINTA.put(28, "VEINTIOCHO");
CASOS_MENORES_TREINTA.put(29, "VEINTINUEVE");
}
private static String wordifyPositiveThreeDigits(int number) {
if (number < 0 || number >= 1000) return "";
int centenas = Math.floorDiv(number, 100);
int restoCien = number % 100;
int decenas = Math.floorDiv(restoCien, 10);
int unidades = number % 10;
StringBuilder str = new StringBuilder();
str.append(CENTENAS.get(centenas));
if (restoCien != 0 && centenas == 1)
str.append("TO"); // CIEN pasa a CIENTO en el caso de ser CIENTO UNO, CIENTO DOS...
if (centenas != 0 && restoCien != 0)
str.append(" "); // Espacio entre centenas y unidades. e.g.: DOSCIENTOS CUATRO
if (restoCien > 10 && restoCien < 30) {
str.append(CASOS_MENORES_TREINTA.get(restoCien)); // Casos desde ONCE hasta VEINTINUEVE
return str.toString();
}
str.append(DECENAS.get(decenas));
if (unidades != 0 && decenas >= 3) str.append(" Y "); // Y entre decenas y unidades e.g.: TREINTA Y UNO
str.append(UNIDADES.get(unidades));
return str.toString();
}
public static String transform(int number) {
if (number > 1_000_000 || number < 0) return "";
else if (number == 1_000_000) return "UN MILLÓN";
else if (number == 0) return "CERO";
int milenios = Math.floorDiv(number, 1000);
int resto = number % 1000;
StringBuilder str = new StringBuilder();
// Omitimos 1 de ej: 1323 porque eso es MIL TRESC... no UNO MIL
if (milenios != 1) str.append(wordifyPositiveThreeDigits(milenios)).append(" ");
if (milenios != 0) {
// Borrar O de UNO para que quede e.g: CIENTO UN MIL
if (milenios % 10 == 1 && milenios != 1)
str.deleteCharAt(str.length() - 2);
str.append("MIL");
}
// Espacio entre milenios y centenas
if (milenios != 0 && resto != 0) str.append(" ");
str.append(wordifyPositiveThreeDigits(resto));
return str.toString();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment