package org.orbeon.saxon.number;
public class Numberer_fi extends AbstractNumberer {
private static final long serialVersionUID = 1L;
private static String[] finnishOrdinalUnits = {
"", "ensimm\u00e4inen", "toinen", "kolmas", "nelj\u00e4s", "viides",
"kuudes", "seitsem\u00e4s", "kahdeksas", "yhdeks\u00e4s",
"kymmenes", "yhdestoista", "kahdestoista", "kolmastoista", "nelj\u00e4stoista", "viidestoista",
"kuudestoista", "seitsem\u00e4stoista", "kahdeksastoista", "yhdeks\u00e4stoista"};
private static String[] finnishOrdinalTens = {
"", "kymmenes", "kahdeskymmenes", "kolmaskymmenes", "nelj\u00e4skymmenes", "viideskymmenes",
"kuudeskymmenes", "seitsem\u00e4skymmenes", "kahdeksaskymmenes", "yhdeks\u00e4skymmenes"};
private static String[] finnishUnits = {
"", "yksi", "kaksi", "kolme", "nelj\u00e4", "viisi", "kuusi", "seitsem\u00e4n", "kahdeksan", "yhdeks\u00e4n", "kymmenen",
"yksitoista", "kaksitoista", "kolmetoista", "nelj\u00e4toista", "viisitoista", "kuusitoista", "seitsem\u00e4ntoista",
"kahdeksantoista", "yhdeks\u00e4ntoista"};
private static String[] finnishTens = {
"", "kymmenen", "kaksikymment\u00e4", "kolmekymment\u00e4", "nelj\u00e4kymment\u00e4", "viisikymment\u00e4",
"kuusikymment\u00e4", "seitsem\u00e4nkymment\u00e4", "kahdeksankymment\u00e4", "yhdeks\u00e4nkymment\u00e4"};
private static long ONE_HUNDRED = 100L;
private static long ONE_THOUSAND = 1000L;
private static long ONE_MILLION = 1000000L;
private static long ONE_BILLION = 1000000000L;
/**
*
* Show an ordinal number as finnish words in a requested case (for example, Twentyfirst)
*
* @param ordinalParam not used.
* @param number the number to be converted to a word.
* @param wordCase UPPER_CASE or LOWER_CASE.
* @return String representing the number in words.
*/
public String toOrdinalWords(String ordinalParam, long number, int wordCase) {
String s = (number == 0) ? "nolla" : toOrdinalWordsPriv(number);
if (wordCase == UPPER_CASE) {
return s.toUpperCase();
} else if (wordCase == LOWER_CASE) {
return s.toLowerCase();
} else {
return s;
}
}
private String toOrdinalWordsPriv(long number) {
String s = "";
if (number >= ONE_BILLION) {
s = toBillionOrdinalWordsPriv(number) + toOrdinalWordsPriv(number % ONE_BILLION);
} else if (number >= ONE_MILLION) {
s = toMillionOrdinalWordsPriv(number) + toOrdinalWordsPriv(number % ONE_MILLION);
} else if (number >= ONE_THOUSAND) {
s = toThousandOrdinalWordsPriv(number) + toOrdinalWordsPriv(number % ONE_THOUSAND);
} else if (number >= ONE_HUNDRED) {
s = toHundredOrdinalWordsPriv(number) + toOrdinalWordsPriv(number % ONE_HUNDRED);
} else {
if (number < 20) {
s = finnishOrdinalUnits[(int) number];
} else {
int rem = (int) (number % 10);
if (rem == 0) {
s = finnishOrdinalTens[(int) number / 10];
} else {
s = finnishTens[(int) number / 10] + finnishOrdinalUnits[rem];
}
}
}
return s;
}
private String toBillionOrdinalWordsPriv(long number) {
String result = "";
long units = number / ONE_BILLION;
long rem = number % ONE_BILLION;
if (units > 0) {
if (rem == 0) {
result = (units == 1) ? "miljardisosa" : (toWordsPriv(units) + " miljardisosa");
} else {
if (units == 1) {
result = "miljardi ";
} else {
result = toWordsPriv(units) + " miljardi ";
;
}
}
}
return result;
}
private String toMillionOrdinalWordsPriv(long number) {
String result = "";
long units = number / ONE_MILLION;
long rem = number % ONE_MILLION;
if (units > 0) {
if (rem == 0) {
result = (units == 1) ? "miljoonas" : (toWordsPriv(units) + " miljoonas");
} else {
if (units == 1) {
result = "miljoona ";
} else {
result = toWordsPriv(units) + " miljoona ";
}
}
}
return result;
}
private String toThousandOrdinalWordsPriv(long number) {
String result = "";
long units = number / ONE_THOUSAND;
long rem = number % ONE_THOUSAND;
if (units > 0) {
if (rem == 0) {
result = (units == 1) ? "tuhannesosa" : (toWordsPriv(units) + "tuhannesosa");
} else {
if (units == 1) {
result = "tuhat ";
} else {
result = toWordsPriv(units) + "tuhat ";
}
}
}
return result;
}
private String toHundredOrdinalWordsPriv(long number) {
String result = "";
long units = number / ONE_HUNDRED;
long rem = number % ONE_HUNDRED;
if (units > 0) {
if (rem == 0) {
result = toWordsPriv(units) + "sadasosa";
} else {
if (units == 1) {
result = "sata";
} else {
result = toWordsPriv(units) + "sata";
}
}
}
return result;
}
public String toWords(long number) {
return (number == 0) ? "nolla" : toWordsPriv(number);
}
private String toWordsPriv(long number) {
String result = "";
if (number >= ONE_BILLION) {
result = toBillionWordsPriv(number) + toWordsPriv(number % ONE_BILLION);
} else if (number >= ONE_MILLION) {
result = toMillionWordsPriv(number) + toWordsPriv(number % ONE_MILLION);
} else if (number >= ONE_THOUSAND) {
result = toThousandWordsPriv(number) + toWordsPriv(number % ONE_THOUSAND);
} else if (number >= ONE_HUNDRED) {
result = toHundredWordsPriv(number) + toWordsPriv(number % ONE_HUNDRED);
} else {
if (number < 20) return finnishUnits[(int) number];
int rem = (int) (number % 10);
return finnishTens[(int) number / 10] + finnishUnits[rem];
}
return result;
}
private String toBillionWordsPriv(long number) {
String result = "";
long units = number / ONE_BILLION;
if (units > 0) {
result = (units == 1) ? "miljardi" : toWordsPriv(units) + " miljardi";
if (number % ONE_BILLION > 0) result += ' ';
}
return result;
}
private String toMillionWordsPriv(long number) {
String result = "";
long units = number / ONE_MILLION;
if (units > 0) {
result = (units == 1) ? "miljoona" : toWordsPriv(units) + " miljoona";
if (number % ONE_MILLION > 0) result += ' ';
}
return result;
}
private String toThousandWordsPriv(long number) {
String result = "";
long units = number / ONE_THOUSAND;
if (units > 0) {
result = (units == 1) ? "tuhat" : toWordsPriv(units) + "tuhat";
if (number % ONE_THOUSAND > 0) result += ' ';
}
return result;
}
private String toHundredWordsPriv(long number) {
String result = "";
long units = number / ONE_HUNDRED;
if (units > 0) {
result = (units == 1) ? "sata" : toWordsPriv(units) + "sata";
}
return result;
}
public String toWords(long number, int wordCase) {
String s;
if (number == 0) {
s = "nolla";
} else {
s = toWords(number);
}
if (wordCase == UPPER_CASE) {
return s.toUpperCase();
} else if (wordCase == LOWER_CASE) {
return s.toLowerCase();
} else {
return s;
}
}
private static String[] finnishMonths = {
"tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kes\u00e4kuu",
"hein\u00e4kuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"
};
/**
* Get a month name or abbreviation
*
* @param month The month number (1=January, 12=December)
* @param minWidth The minimum number of characters
* @param maxWidth The maximum number of characters
*/
public String monthName(int month, int minWidth, int maxWidth) {
String name = finnishMonths[month - 1];
if (maxWidth < 3) {
maxWidth = 3;
}
if (name.length() > maxWidth) {
name = name.substring(0, maxWidth);
}
while (name.length() < minWidth) {
name = name + ' ';
}
return name;
}
/**
* Get a day name or abbreviation
*
* @param day The day of the week (1=Monday, 7=Sunday)
* @param minWidth The minimum number of characters
* @param maxWidth The maximum number of characters
*/
public String dayName(int day, int minWidth, int maxWidth) {
String name = finnishDays[day - 1];
if (maxWidth < 2) {
maxWidth = 2;
}
if (name.length() > maxWidth) {
name = finnishDayAbbreviations[day - 1];
if (name.length() > maxWidth) {
name = name.substring(0, maxWidth);
}
}
while (name.length() < minWidth) {
name = name + ' ';
}
if (minWidth == 1 && maxWidth == 2) {
// special case
name = name.substring(0, minUniqueDayLength[day - 1]);
}
return name;
}
private static String[] finnishDays = {
"maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai"
};
private static String[] finnishDayAbbreviations = {
"ma", "ti", "ke", "to", "pe", "la", "su"
};
private static int[] minUniqueDayLength = {
1, 2, 1, 2, 1, 1, 1
};
}