package org.orbeon.saxon.number; /** * Numberer class for the Swedish language. * * @see <a href="http://en.wikipedia.org/wiki/Swedish_grammar">http://en.wikipedia.org/wiki/Swedish_grammar</a> * @see <a href="http://www2.hhs.se/isa/swedish/chap4.htm">http://www2.hhs.se/isa/swedish/chap4.htm</a> */ public class Numberer_sv extends AbstractNumberer { private static final long serialVersionUID = 1L; private static String[] swedishOrdinalUnits = { "", "f\u00f6rsta", "andra", "tredje", "fj\u00e4rde", "femte", "sj\u00e4tte", "sjunde", "\u00e5ttonde", "nionde", "tionde", "elfte", "tolfte", "trettonde", "fjortonde", "femtonde", "sextonde", "sjuttonde", "artonde", "nittonde"}; private static String[] swedishOrdinalTens = { "", "tionde", "tjugonde", "trettionde", "fyrtionde", "femtionde", "sextionde", "sjuttionde", "\u00e5ttionde", "nittionde"}; private static String[] swedishUnits = { "", "ett", "tv\u00e5", "tre", "fyra", "fem", "sex", "sju", "\u00e5tta", "nio", "tio", "elva", "tolv", "tretton", "fjorton", "femton", "sexton", "sjutton", "arton", "nitton"}; private static String[] swedishTens = { "", "tio", "tjugo", "trettio", "fyrtio", "femtio", "sextio", "sjuttio", "\u00e5ttio", "nittio"}; private static long ONE_HUNDRED = 100L; private static long ONE_THOUSAND = 1000L; private static long ONE_MILLION = 1000000L; private static long ONE_BILLION = 1000000000L; // Swedish definition 10^9 /** * Show an ordinal number as swedish 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) ? "nollte" : 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 = swedishOrdinalUnits[(int) number]; } else { int rem = (int) (number % 10); if (rem == 0) { s = swedishOrdinalTens[(int) number / 10]; } else { s = swedishTens[(int) number / 10] + swedishOrdinalUnits[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) ? "miljardte" : (toWordsPriv(units) + " miljardte"); } else { if (units == 1) { result = "en miljard "; } else { result = toWordsPriv(units) + " miljarder "; ; } } } 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) ? "miljonte" : (toWordsPriv(units) + " miljonte"); } else { if (units == 1) { result = "en miljon "; } else { result = toWordsPriv(units) + " miljoner "; } } } 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) ? "tusende" : (toWordsPriv(units) + "tusende"); } else { if (units == 1) { result = "ettusen "; } else { result = toWordsPriv(units) + "tusen "; } } } 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) + "hundrade"; } else { if (units == 1) { result = "etthundra"; } else { result = toWordsPriv(units) + "hundra"; } } } return result; } public String toWords(long number) { return (number == 0) ? "noll" : 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 swedishUnits[(int) number]; int rem = (int) (number % 10); return swedishTens[(int) number / 10] + swedishUnits[rem]; } return result; } private String toBillionWordsPriv(long number) { String result = ""; long units = number / ONE_BILLION; if (units > 0) { result = (units == 1) ? "en miljard" : toWordsPriv(units) + " miljarder"; 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) ? "en miljon" : toWordsPriv(units) + " miljoner"; 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) ? "ettusen" : toWordsPriv(units) + "tusen"; 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) ? "etthundra" : toWordsPriv(units) + "hundra"; } return result; } public String toWords(long number, int wordCase) { String s; if (number == 0) { s = "noll"; } 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[] swedishMonths = { "januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december" }; /** * 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 */ //@Override public String monthName(int month, int minWidth, int maxWidth) { String name = swedishMonths[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 = swedishDays[day - 1]; if (maxWidth < 2) { maxWidth = 2; } if (name.length() > maxWidth) { name = swedishDayAbbreviations[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[] swedishDays = { "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag", "s\u00f6ndag" }; private static String[] swedishDayAbbreviations = { "m\u00e5nd", "tisd", "onsd", "tors", "fred", "l\u00f6rd", "s\u00f6nd" }; private static int[] minUniqueDayLength = { 1, 2, 1, 2, 1, 1, 1 }; } // // The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); // you may not use this file except in compliance with the License. You may obtain a copy of the // License at http://www.mozilla.org/MPL/ // // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. // See the License for the specific language governing rights and limitations under the License. // // The Original Code is: all this file // // The Initial Developer of the Original Code is Michael H. Kay. // // Contributor(s): Karel Goossens, Hakan Soderstrom, Erik Bruchez // See also: http://discuss.orbeon.com/Swedish-localization-contribution-offered-td4656518.html //