/** * */ package net.conselldemallorca.helium.core.util; import java.math.BigDecimal; /** * Transforma quantitas numèriques en text en castellà * * @author Limit Tecnologies <limit@limit.es> */ public class NombreEnCastella { public static final int MONEDA_PESETA = 0; public static final int MONEDA_EURO = 1; public static final int MONEDA_DOLAR = 2; public static final int SEXE_MASCULI = 0; public static final int SEXE_FEMENI = 1; private static final String[][] TEXT_MONEDA = new String[][] { {"peseta", "pesetas", "céntimo", "céntimos"}, {"euro", "euros", "céntimo", "céntimos"}, {"dólar", "dólares", "centavo", "centavos"} }; private static final int[][] SEXE_MONEDA = new int[][] { {SEXE_FEMENI, SEXE_MASCULI}, {SEXE_MASCULI, SEXE_MASCULI}, {SEXE_MASCULI, SEXE_MASCULI} }; private static final String TEXT_ZERO = "cero"; private static final String[] TEXT_CENT = {"cien", "ciento", "cientos", "cientas"}; private static final String[][] TEXT_FINS_A_VINT = new String[][] { {"", ""}, {"uno", "una"}, {"dos", null}, {"tres", null}, {"cuatro", null}, {"cinco", null}, {"seis", null}, {"siete", null}, {"ocho", null}, {"nueve", null}, {"diez", null}, {"once", null}, {"doce", null}, {"trece", null}, {"catorce", null}, {"quince", null}, {"dieciseis", null}, {"diecisiete", null}, {"dieciocho", null}, {"diecinueve", null}}; private static final String[] TEXT_DECENES = new String[] { "", "diez", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa"}; private static final String[][] TEXT_GRUPS = new String[][] { {"", ""}, {"millón", "millones"}, {"billón", "billones"}, {"trillón", "trillones"}, {"cuatrillón", "cuatrillones"}, {"quintillón", "quintillones"}, {"sexillón", "sexillones"}, {"septillón", "septillones"}, {"octillón", "octillones"}, {"nonillón", "nonillones"} }; public static String escriureNombre( long nombre, int sexe) { StringBuffer sb = new StringBuffer(); long2text(nombre, sb, 0, sexe, true); if (nombre < 0) sb.insert(0, "menos "); return sb.toString().trim(); } public static String escriurePreu( BigDecimal preu, int numDecimals, int moneda) { long partSencera = preu.longValue(); long partDecimal = 0; if (numDecimals != -1) { preu.setScale(numDecimals, BigDecimal.ROUND_HALF_UP); partDecimal = preu.subtract(new BigDecimal(partSencera)).multiply(new BigDecimal(Math.pow(10, numDecimals))).longValue(); } StringBuffer sbSencer = new StringBuffer(); long2text(partSencera, sbSencer, 0, SEXE_MONEDA[moneda][0], true); StringBuffer sbDecimal = new StringBuffer(); long2text(partDecimal, sbDecimal, 0, SEXE_MONEDA[moneda][1], true); StringBuffer sbPreu = new StringBuffer(); if (partSencera < 0) sbPreu.insert(0, "menos "); sbPreu.append(sbSencer.toString().trim()); sbPreu.append(" "); if (partSencera == 1) sbPreu.append(TEXT_MONEDA[moneda][0]); else sbPreu.append(TEXT_MONEDA[moneda][1]); if (partDecimal != 0) { sbPreu.append(" con "); sbPreu.append(sbDecimal); sbPreu.append(" "); if (partDecimal == 1) sbPreu.append(TEXT_MONEDA[moneda][2]); else sbPreu.append(TEXT_MONEDA[moneda][3]); } return sbPreu.toString().trim(); } private static void long2text( long nombre, StringBuffer sb, int grupIndex, int sexe, boolean grupAnteriorZero) { if (nombre < 0) nombre = -nombre; if (nombre == 0 && grupIndex == 0) sb.append(TEXT_ZERO); String nombreStr = Long.toString(nombre); if (nombreStr.length() > 3 * grupIndex) { String grupString = grupAmbIndex(nombreStr, grupIndex); int grup = Integer.parseInt(grupString); int centenes = Integer.parseInt(grupString.substring(0, 1)); int decenes = Integer.parseInt(grupString.substring(1, 2)); int unitats = Integer.parseInt(grupString.substring(2, 3)); int decenesAmbUnitats = decenes * 10 + unitats; if (grup > 0) { if (grupIndex > 0) sb.insert(0, " "); if (grupIndex % 2 == 1) { if (grupAnteriorZero) { sb.insert(0, textMilions(grupIndex, false)); sb.insert(0, " "); } sb.insert(0, "mil"); } else { sb.insert(0, textMilions(grupIndex, grup == 1)); } if (grupIndex > 0) sb.insert(0, " "); if (grupIndex % 2 != 1 || grup != 1) { // perque no surti "1100: un mil cent" if (decenesAmbUnitats == 1 && grupIndex > 0) { sb.insert(0, "un"); } else if (decenesAmbUnitats < 20) { sb.insert(0, textMenorVint(decenesAmbUnitats, sexe)); } else { if (unitats > 0) { sb.insert(0, textMenorVint(unitats, sexe)); if (decenes != 2) sb.insert(0, " y "); else sb.insert(0, "veinti"); } if (decenes != 2 || unitats == 0) sb.insert(0, TEXT_DECENES[decenes]); } if (centenes > 0) { if (decenesAmbUnitats > 0) sb.insert(0, " "); if (centenes > 1) { if (centenes != 5) { sb.insert(0, TEXT_CENT[(sexe == SEXE_FEMENI) ? 3 : 2]); switch (centenes) { case 7: sb.insert(0, "sete"); break; case 9: sb.insert(0, "nove"); break; default: sb.insert(0, textMenorVint(centenes, sexe)); } } else { sb.insert(0, (sexe == SEXE_FEMENI) ? "quinientas" : "quinientos"); } } else { if (grup == 100) sb.insert(0, TEXT_CENT[0]); else sb.insert(0, TEXT_CENT[1]); } } } } long2text(nombre, sb, grupIndex + 1, SEXE_MASCULI, grup == 0); } } private static String grupAmbIndex(String nombreStr, int grupIndex) { int endIndex = nombreStr.length() - (3 * grupIndex); int beginIndex = endIndex - 3; if (beginIndex < 0) beginIndex = 0; long grup = Long.parseLong(nombreStr.substring(beginIndex, endIndex)); java.text.DecimalFormat decimalFormat = new java.text.DecimalFormat("000"); return decimalFormat.format(grup); } private static String textMenorVint(int index, int sexe) { if (TEXT_FINS_A_VINT[index][sexe] == null) return TEXT_FINS_A_VINT[index][0]; else return TEXT_FINS_A_VINT[index][sexe]; } private static String textMilions(int grupIndex, boolean singular) { if (grupIndex / 2 < TEXT_GRUPS.length) return TEXT_GRUPS[grupIndex / 2][singular ? 0 : 1]; else return (grupIndex / 2) + (singular ? "lió" : "lions"); } }