package cz.steger.utils;
/**
* Konverze čísla na text, např. 1609 na "jedentisícšestsetdevět".
*
* @author Ondřej Steger, 29.07.2007
*
*/
public class Number2Text {
private static int language = 1;
private static String rod = "M";
private static final String ROD_MASCULINUM = "M";
private static final String ROD_FEMININUM = "F";
private static final String ROD_NEUTRUM = "N";
private static Number2Text instance = null;
private Number2Text() {
}
public static Number2Text getInstance() {
if (instance == null)
instance = new Number2Text();
return instance;
}
public Number2Text(int language, String rod) {
this.language = language;
this.rod = rod;
}
private static final String[][] majorNames = { { "", "", "" },
{ "tisíc", "tisíce", "tisíc" }, { "milión", "milióny",
"miliónů" },
{ "miliarda", "miliardy", "miliard" },
{ "trilión", "trilióny", "triliónů" },
{ "kvadrilión", "kvadrilióny", "kvadriliónů" },
{ "kvintilión", "kvintilióny", "kvintiliónů" } };
private static final String[] tensNames = { "", "deset", "dvacet",
"třicet", "čtyřicet", "padesát", "šedesát", "sedmdesát",
"osmdesát", "devadesát" };
private static final String[][] numNames = { { "", "", "" },
{ "jeden", "jedna", "jedno" }, { "dva", "dvě", "dvě" },
{ "tři", "tři", "tři" }, { "čtyři", "čtyři", "čtyři" },
{ "pět", "pět", "pět" }, { "šest", "šest", "šest" },
{ "sedm", "sedm", "sedm" }, { "osm", "osm", "osm" },
{ "devět", "devět", "devět" }, { "deset", "deset",
"deset" },
{ "jedenáct", "jedenáct", "jedenáct" },
{ "dvanáct", "dvanáct", "dvanáct" },
{ "třináct", "třináct", "třináct" },
{ "čtrnáct", "čtrnáct", "čtrnáct" },
{ "patnáct", "patnáct", "patnáct" },
{ "šestnáct", "šestnáct", "šestnáct" },
{ "sedmnáct", "sedmnáct", "sedmnáct" },
{ "osmnáct", "osmnáct", "osmnáct" },
{ "devatenáct", "devatenáct", "devatenáct" } };
private String convertLessThanOneThousand(int number, int place) {
String soFar;
if (number % 100 < 20) {
if (place == 0)
if (rod.equals(ROD_MASCULINUM))
soFar = numNames[number % 100][0];
else if (rod.equals(ROD_FEMININUM))
soFar = numNames[number % 100][1];
else
soFar = numNames[number % 100][2];
else if (place < 2)
soFar = numNames[number % 100][0];
else if (place == 3)
soFar = numNames[number % 100][1];
else
soFar = numNames[number % 100][0];
number /= 100;
} else {
soFar = numNames[number % 10][0];
number /= 10;
soFar = tensNames[number % 10] + soFar;
number /= 10;
}
if (number == 0)
return soFar;
if (number == 1)
return numNames[number][2] + "sto" + soFar;
else if (number == 2)
return numNames[number][1] + "stě" + soFar;
else if (number == 3 || number == 4)
return numNames[number][0] + "sta" + soFar;
else
return numNames[number][0] + "set" + soFar;
}
public String convert(int number) {
return this.convert(number, ROD_MASCULINUM, 1);
}
/**
*
* @param number
* @param rod M = masculinum, F = femininum, N = neutrum
* @param language
* @return
*/
public String convert(int number, String rod, int language) {
this.language = language;
/* special case */
if (number == 0) {
return "nula";
}
String prefix = "";
if (number < 0) {
number = -number;
prefix = "-";
}
String soFar = "";
int place = 0;
do {
int n = number % 1000;
if (n != 0) {
String s = convertLessThanOneThousand(n, place);
String majS = String.valueOf(n);
int maj =
Integer.valueOf(majS.substring(majS.length() - 1))
.intValue();
if (maj == 1)
soFar = s + majorNames[place][0] +
soFar;
else if (maj > 1 && maj < 5)
soFar = s + majorNames[place][1] +
soFar;
else
soFar = s + majorNames[place][2] +
soFar;
}
place++;
number /= 1000;
} while (number > 0);
return (prefix + soFar).trim();
}
public static void main(String[] args) {
Number2Text f = new Number2Text(1, "F");
System.out.println("*** " + f.convert(0));
System.out.println("*** " + f.convert(1));
System.out.println("*** " + f.convert(16));
System.out.println("*** " + f.convert(100));
System.out.println("*** " + f.convert(118));
System.out.println("*** " + f.convert(200));
System.out.println("*** " + f.convert(219));
System.out.println("*** " + f.convert(800));
System.out.println("*** " + f.convert(801));
System.out.println("*** " + f.convert(1609));
System.out.println("*** " + f.convert(2230316));
System.out.println("*** " + f.convert(3316));
System.out.println("*** " + f.convert(1000000));
System.out.println("*** " + f.convert(2000000));
System.out.println("*** " + f.convert(3000200));
System.out.println("*** " + f.convert(700000));
System.out.println("*** " + f.convert(9999992));
System.out.println("*** " + f.convert(123456789));
System.out.println("*** " + f.convert(-45));
}
}
Hledal jsem kód pro konverzi čísla na text, např.
"jedentisícšestsetdevět" a nenašel, možná špatně hledal. Rozšířil jsem
nějakou anglickou verzi a tady je výsledek, kdyby se to někomu hodilo... :)
- Konverze čísla na text Ondrej Steger
- Re: Konverze čísla na text Pavel Kolesnikov
- Re: Konverze čísla na text Martin Kuba
