/** * */ package net.conselldemallorca.helium.core.util; import java.math.BigDecimal; /** * Transforma quantitas numèriques en text en català * * @author Limit Tecnologies <limit@limit.es> */ public class NombreEnCatala { 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[][] { {"pesseta", "pessetes", "cèntim", "cèntims"}, {"euro", "euros", "cèntim", "cèntims"}, {"dòlar", "dòlars", "centau", "centaus"} }; 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 = "zero"; private static final String[] TEXT_CENT = {"cent", "cents", "centes"}; private static final String[][] TEXT_FINS_A_VINT = new String[][] { {"", ""}, {"un", "una"}, {"dos", "dues"}, {"tres", null}, {"quatre", null}, {"cinc", null}, {"sis", null}, {"set", null}, {"vuit", null}, {"nou", null}, {"deu", null}, {"onze", null}, {"dotze", null}, {"tretze", null}, {"catorze", null}, {"quinze", null}, {"setze", null}, {"desset", null}, {"devuit", null}, {"denou", null}}; private static final String[] TEXT_DECENES = new String[] { "", "deu", "vint", "trenta", "quaranta", "cinquanta", "seixanta", "setanta", "vuitanta", "noranta"}; private static final String[][] TEXT_GRUPS = new String[][] { {"", ""}, {"milió", "milions"}, {"bilió", "bilions"}, {"trilió", "trilions"}, {"cuatrilió", "cuatrilions"}, {"quintilió", "quintilions"}, {"sexilió", "sexilions"}, {"septilió", "septilions"}, {"octilió", "octilions"}, {"nonilió", "nonilions"} }; public static String escriureNombre( long nombre, int sexe) { StringBuffer sb = new StringBuffer(); long2text(nombre, sb, 0, sexe, true); if (nombre < 0) sb.insert(0, "menys "); 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, "menys "); 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(" amb "); 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 < 20) { sb.insert(0, textMenorVint(decenesAmbUnitats, sexe)); } else { if (unitats > 0) { sb.insert(0, textMenorVint(unitats, sexe)); if (decenes == 2) sb.insert(0, "i-"); sb.insert(0, "-"); } sb.insert(0, TEXT_DECENES[decenes]); } if (centenes > 0) { if (decenesAmbUnitats > 0) sb.insert(0, " "); if (centenes > 1) { sb.insert(0, TEXT_CENT[(sexe == SEXE_FEMENI) ? 2 : 1]); sb.insert(0, "-"); sb.insert(0, textMenorVint(centenes, sexe)); } else { sb.insert(0, TEXT_CENT[0]); } } } } 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"); } }