/** * Copyright (C) 2014 Orbeon, Inc. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software Foundation; either version * 2.1 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * The full text of the license is available at http://www.gnu.org/copyleft/lesser.html */ package org.orbeon.saxon.number; public class Numberer_pl extends AbstractNumberer { private static final long serialVersionUID = 1L; private static String[] polishOrdinalUnits = { "", "pierwszy", "drugi", "trzeci", "czwarty", "piąty", "szósty", "siódmy", "ósmy", "dziewiąty", "dziesiąty", "jedenasty", "dwunasty", "trzynasty", "czternasty", "piętnasty", "szesnasty", "siedemnasty", "osiemnasty", "dziewiętnasty" }; private static String[] polishOrdinalTens = { "", "dziesiąty", "dwudziesty", "trzydziesty", "czterdziesty", "pięćdziesiąty", "sześćdziesiąty", "siedemdziesiąty", "osiemdziesiąty", "dziewięćdziesiąty" }; private static String[] polishOrdinalHundreds = { "", "setny", "dwusetny", "trzechsetny", "czterechsetny", "pięćsetny", "sześćsetny", "siedemsetny", "osiemsetny", "dziewięćsetny" }; private static String[] polishUnits = { "", "jeden", "dwa", "trzy", "cztery", "pięć", "sześć", "siedem", "osiem", "dziewięć", "dziesięć", "jedenaście", "dwanaście", "trzynaście", "czternaście", "piętnaście", "szesnaście", "siedemnaście", "osiemnaście", "dziewiętnaście" }; private static String[] polishTens = { "", "dziesięć", "dwadzieścia", "trzydzieści", "czterdzieści", "pięćdziesiąt", "sześćdziesiąt", "siedemdziesiąt", "osiemdziesiąt", "dziewięćdziesiąt" }; private static String[] polishHundreds = { "", "sto", "dwieście", "trzysta", "czterysta", "pięćset", "sześćset", "siedemset", "osiemset", "dziewięćset" }; public String toOrdinalWords(String ordinalParam, long number, int wordCase) { String s; if (number == 1000000000) { s = "miliardowy"; } else if (number == 1000000) { s = "milionowy"; } else if (number == 1000) { s = "tysięczny"; } else if ( (number % 100 == 0) && (number / 100 < 10) ) { s = polishOrdinalHundreds[(int) number / 100]; } else if (number >= 1000000000) { long rem = number % 1000000000; return (number / 1000000000 == 1 ? "" : toWords(number / 1000000000)) + " " + "miliard" + getEnding( (int) number / 1000000000 ) + " " + toOrdinalWords(ordinalParam, rem, wordCase) + " "; } else if (number >= 1000000) { long rem = number % 1000000; return (number / 1000000 == 1 ? "" : toWords(number / 1000000)) + " " + "milion" + getEnding( (int) number / 1000000 ) + " " + toOrdinalWords(ordinalParam, rem, wordCase) + " "; } else if (number >= 1000) { long rem = number % 1000; s = (number / 1000 == 1 ? "" : toWords(number / 1000)) + " "; if( ( number / 1000 > 10 ) && ( number / 1000 < 20 ) ) { s += "tysięcy" + " "; } else { if( (number / 1000) % 10 == 1 ) s += "tysiąc" + " "; else if( ( (number / 1000) % 10 > 1 ) && ( (number / 1000) % 10 < 5 ) ) s += "tysiące" + " "; else s += "tysięcy" + " "; } s += toWords(rem) + " "; return s + " "; } else if (number >= 100) { long rem = number % 100; return polishHundreds[(int) number / 100] + " " + toOrdinalWords(ordinalParam, rem, wordCase) + " "; } else { if (number < 20) { return polishOrdinalUnits[(int) number] + " "; } int rem = (int) (number % 10); return polishOrdinalTens[(int) number / 10] + " " + polishOrdinalUnits[rem] + " "; } if (wordCase == UPPER_CASE) { return s.toUpperCase(); } else if (wordCase == LOWER_CASE) { return s.toLowerCase(); } else { return s; } } private String getEnding(int number) { if( ( number > 10 ) && ( number < 20 ) ) { return "ów"; } else { if( number % 10 == 1 ) return ""; else if( ( number % 10 > 1 ) && ( number % 10 < 5 ) ) return "y"; else return "ów"; } } public String toWords(long number) { String s; if (number >= 1000000000) { long rem = number % 1000000000; return (number / 1000000000 == 1 ? "" : toWords(number / 1000000000)) + "miliard" + getEnding( (int) number / 1000000000 ) + toWords(rem) + " "; } else if (number >= 1000000) { long rem = number % 1000000; return (number / 1000000 == 1 ? " " : toWords(number / 1000000)) + "milion" + getEnding( (int) number / 1000000 ) + toWords(rem) + " "; } else if (number >= 1000) { long rem = number % 1000; s = (number / 1000 == 1 ? "" : toWords(number / 1000)) + " "; if( ( number / 1000 > 10 ) && ( number / 1000 < 20 ) ) { s += "tysięcy" + " "; } else { if( (number / 1000) % 10 == 1 ) s += "tysiąc" + " "; else if( ( (number / 1000) % 10 > 1 ) && ( (number / 1000) % 10 < 5 ) ) s += "tysiące" + " "; else s += "tysięcy" + " "; } s += toWords(rem); return s; } else if (number >= 100) { long rem = number % 100; return polishHundreds[(int) number / 100] + " " + toWords(rem) + " "; } else { if (number < 20) { return polishUnits[(int) number] + " "; } int rem = (int) (number % 10); return polishTens[(int) number / 10] + " " + polishUnits[rem] + " "; } } private static String[] polishMonths = { "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" }; public String monthName(int month, int minWidth, int maxWidth) { String name = polishMonths[month - 1]; if (maxWidth < 3) { maxWidth = 3; } if (name.length() > maxWidth) { name = name.substring(0, maxWidth); } while (name.length() < minWidth) { name = name + ' '; } return name; } public String dayName(int day, int minWidth, int maxWidth) { String name = polishDays[day - 1]; if (maxWidth < 2) { maxWidth = 2; } if (name.length() > maxWidth) { name = polishDayAbbreviations[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[] polishDays = { "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota", "niedziela" }; private static String[] polishDayAbbreviations = { "pon.", "wt.", "śr.", "czw.", "pt.", "sob.", "niedz." }; private static int[] minUniqueDayLength = { 2, 2, 2, 2, 2, 2, 2 }; }