package org.orbeon.saxon.number;
/**
* Numberer class for the Spanish language
*/
public class Numberer_es extends AbstractNumberer {
/**
* Construct the ordinal suffix for a number, for example "st", "nd", "rd"
*
* @param ordinalParam the value of the ordinal attribute (used in non-English
* language implementations)
* @param number the number being formatted
* @return the ordinal suffix to be appended to the formatted number
*/
protected String ordinalSuffix(String ordinalParam, long number) {
int penult = ((int) (number % 100)) / 10;
int ult = (int) (number % 10);
if (penult == 1) {
// e.g. 11th, 12th, 13th
return "th";
} else {
if (ult == 1) {
return "st";
} else if (ult == 2) {
return "nd";
} else if (ult == 3) {
return "rd";
} else {
return "th";
}
}
}
/**
* Show the number as words in title case. (We choose title case because
* the result can then be converted algorithmically to lower case or upper case).
*
* @param number the number to be formatted
* @return the number formatted as English words
*/
public String toWords(long number) {
if (number >= 1000000000) {
long rem = number % 1000000000;
return toWords(number / 1000000000) + " Billón/es" +
(rem == 0 ? "" : (rem < 100 ? " " : " ") + toWords(rem));
} else if (number >= 1000000) {
long rem = number % 1000000;
return toWords(number / 1000000) + " Millón/es" +
(rem == 0 ? "" : (rem < 100 ? " " : " ") + toWords(rem));
} else if (number >= 1000) {
long rem = number % 1000;
return toWords(number / 1000) + " Mil/es" +
(rem == 0 ? "" : (rem < 100 ? " " : " ") + toWords(rem));
} else if (number >= 100) {
long rem = number % 100;
return toWords(number / 100) + " Ciento/s" +
(rem == 0 ? "" : " " + toWords(rem));
} else {
if (number < 20) return spanishUnits[(int) number];
int rem = (int) (number % 10);
return spanishTens[(int) number / 10] +
(rem == 0 ? "" : ' ' + spanishUnits[rem]);
}
}
/**
* Show an ordinal number as English words in a requested case (for example, Twentyfirst)
*
* @param ordinalParam the value of the "ordinal" attribute as supplied by the user
* @param number the number to be formatted
* @param wordCase the required case for example {@link #UPPER_CASE},
* {@link #LOWER_CASE}, {@link #TITLE_CASE}
* @return the formatted number
*/
public String toOrdinalWords(String ordinalParam, long number, int wordCase) {
String s;
if (number >= 1000000000) {
long rem = number % 1000000000;
s = toWords(number / 1000000000) + " Billón/es" +
(rem == 0 ? "th" : (rem < 100 ? " " : " ") +
toOrdinalWords(ordinalParam, rem, wordCase));
} else if (number >= 1000000) {
long rem = number % 1000000;
s = toWords(number / 1000000) + " Millón/es" +
(rem == 0 ? "th" : (rem < 100 ? " and " : " ") +
toOrdinalWords(ordinalParam, rem, wordCase));
} else if (number >= 1000) {
long rem = number % 1000;
s = toWords(number / 1000) + " Mil/es" +
(rem == 0 ? "th" : (rem < 100 ? " " : " ") +
toOrdinalWords(ordinalParam, rem, wordCase));
} else if (number >= 100) {
long rem = number % 100;
s = toWords(number / 100) + " Ciento/s" +
(rem == 0 ? "th" : " " +
toOrdinalWords(ordinalParam, rem, wordCase));
} else {
if (number < 20) {
s = spanishOrdinalUnits[(int) number];
} else {
int rem = (int) (number % 10);
if (rem == 0) {
s = spanishOrdinalTens[(int) number / 10];
} else {
s = spanishTens[(int) number / 10] + '-' + spanishOrdinalUnits[rem];
}
}
}
if (wordCase == UPPER_CASE) {
return s.toUpperCase();
} else if (wordCase == LOWER_CASE) {
return s.toLowerCase();
} else {
return s;
}
}
private static String[] spanishUnits = {
"", "", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve",
"Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis",
"Diecisiete", "Dieciocho", "Diecinueve"};
private static String[] spanishTens = {
"", "Diez", "Veinte", "Treinta", "Cuarenta", "Cincuenta",
"Sesenta", "Setenta", "Ochenta", "Noventa"};
private static String[] spanishOrdinalUnits = {
"", "Primero", "Segundo", "Tercero", "Cuarto", "Quinto", "Sexto", "Séptimo", "Octavo", "Noveno",
"Décimo", "Undécimo", "Duodécimo", "Decimotercero", "Decimocuarto", "Decimoquinto", "Decimosexto",
"Decimoséptimo", "Decimoctavo", "Decimonoveno"};
private static String[] spanishOrdinalTens = {
"", "Décimo", "Vigésimo", "Trigésimo", "Cuadragésimo", "Quincuagésimo",
"Sexagésimo", "Septuagésimo", "Cctogésimo", "Nonagésimo"};
/**
* 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 = spanishMonths[month - 1];
if (maxWidth < 3) {
maxWidth = 3;
}
if (name.length() > maxWidth) {
name = name.substring(0, maxWidth);
}
while (name.length() < minWidth) {
name = name + ' ';
}
return name;
}
private static String[] spanishMonths = {
"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
};
/**
* 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 = spanishDays[day - 1];
if (maxWidth < 2) {
maxWidth = 2;
}
if (name.length() > maxWidth) {
name = spanishDayAbbreviations[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[] spanishDays = {
"Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"
};
private static String[] spanishDayAbbreviations = {
"Lun", "Mar", "Mie", "Jue", "Vie", "Sab", "Dom"
};
private static int[] minUniqueDayLength = {
1, 2, 1, 2, 1, 2, 2
};
}
//
// 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):
//