Есть ли у Kotlin стандартный способ форматирования числа как английского порядкового номера?
В Swift я могу сделать что-то вроде этого:
let ordinalFormatter = NumberFormatter()
ordinalFormatter.numberStyle = .ordinal
print(ordinalFormatter.string(from: NSNumber(value: 3))) // 3rd
но я не вижу способа сделать это так легко в Котлине. Есть ли такой способ, или мне придется использовать сторонние библиотеки или написать свои собственные?
3 ответа
Ну, обычно трудно доказать, что чего-то не существует. Но я никогда не сталкивался с какой-либо функцией в kotlin-stdlib
это сделало бы это или могло быть немедленно приспособлено для этого. Более того, kotlin-stdlib
кажется, не содержит ничего специфичного для локали (какие порядковые числа, безусловно, являются).
Я полагаю, вам следует прибегнуть к некоторому стороннему программному обеспечению или реализовать собственное решение, которое может быть таким простым:
fun ordinalOf(i: Int) = "$i" + if (i % 100 in 11..13) "th" else when (i % 10) {
1 -> "st"
2 -> "nd"
3 -> "rd"
else -> "th"
}
Также решения на Java: (здесь)
Вот мой вариант решения @hotkey:
fun Int.ordinal() = "$this" + when {
(this % 100 in 11..13) -> "th"
(this % 10) == 1 -> "st"
(this % 10) == 2 -> "nd"
(this % 10) == 3 -> "rd"
else -> "th"
}
Вызвать, например,13.ordinal()
.
fun Int.toOrdinalNumber(): String {
if (this in 11..13) {
return "${this}th"
}
return when (this % 10) {
1 -> "${this}st"
2 -> "${this}nd"
3 -> "${this}rd"
else -> "${this}th"
}
}
В этом коде функция расширения getOrdinalNumber добавляется к классу Int. Сначала он проверяет, находится ли число в диапазоне от 11 до 13, поскольку в этих случаях порядковый номер всегда равен «th». В других случаях он проверяет последнюю цифру номера и добавляет соответственно «st», «nd» или «rd». Если ни одно из этих условий не соответствует, добавляется «th». Функция расширения добавлена в класс Int. Сначала он проверяет, находится ли число в диапазоне от 11 до 13, поскольку в этих случаях порядковый номер всегда равен «th». В других случаях он проверяет последнюю цифру номера и добавляет соответственно «st», «nd» или «rd». Если ни одно из этих условий не соответствует, добавляется «th».