Я не знаю ни одной библиотеки, но лучшим алгоритмом может быть получение всех возможных чисел / локалей / порядковых чисел в Map<Integer, Map<Locale, String>>
.
private static Map<Integer, Map<Locale, String>> ordinals = new HashMap<Integer, Map<Locale, String>>();
static {
Map<Locale, String> ordinal1 = new HashMap<Locale, String>();
ordinal1.put(Locale.ENGLISH, "st");
ordinal1.put(Locale.FRENCH, "er");
ordinals.put(1, ordinal1);
Map<Locale, String> ordinal2 = new HashMap<Locale, String>();
ordinal2.put(Locale.ENGLISH, "nd");
ordinals.put(2, ordinal2);
Map<Locale, String> ordinal3 = new HashMap<Locale, String>();
ordinal3.put(Locale.ENGLISH, "rd");
ordinals.put(3, ordinal3);
Map<Locale, String> ordinal4 = new HashMap<Locale, String>();
ordinal4.put(Locale.ENGLISH, "th");
ordinal4.put(Locale.FRENCH, "ème");
ordinals.put(4, ordinal4);
}
В таком случае getOrdinalFor()
может в основном выглядеть (за исключением очевидной обработки ошибок во время выполнения):
public static String getOrdinalFor(int value, Locale locale) {
return ordinals.get(value).get(locale);
}
Для других чисел, которые не включены в карту, вы можете рассмотреть возможность обратного отсчета числа до тех пор, пока на карте не будет найдено совпадение (чтобы запрос порядкового номера, например, 5
или выше, возвращал бы порядковый номер для 4
(первое следующее совпадение при обратном отсчете)):
public static String getOrdinalFor(int value, Locale locale) {
Map<Locale, String> ordinal = null;
for (int i = value; i > 0 && (ordinal == null || !ordinal.containsKey(locale)); i--) {
ordinal = ordinals.get(i);
}
return ordinal != null ? ordinal.get(locale) : null; // Or other default?
}