Возьмите значение 1-31 и преобразуйте его в порядковый номер с JavaScript
Есть ли фрагмент кода JavaScript, чтобы принять значение 1-31 и преобразовать его в 1, 2, 3 и т.д.?
Спасибо!
Ответы
Ответ 1
function getOrdinal(n) {
var s=["th","st","nd","rd"],
v=n%100;
return n+(s[(v-20)%10]||s[v]||s[0]);
}
Спасибо @RobG
бит измененной версии
function getOrdinal(n) {
if((parseFloat(n) == parseInt(n)) && !isNaN(n)){
var s=["th","st","nd","rd"],
v=n%100;
return n+(s[(v-20)%10]||s[v]||s[0]);
}
return n;
}
Испытания
getOrdinal("test"); // test
getOrdinal(1.5); // 1.5
getOrdinal(1); // 1st
getOrdinal(2); // 2nd
getOrdinal(3); // 3rd
getOrdinal(4); // 4th
getOrdinal(true); // true
getOrdinal(Infinity); // Infinity
getOrdinal(NaN); // NaN
getOrdinal(void 0); // undefined
Ответ 2
Вы можете обнаружить, что удобнее обезглавить функцию в прототипе Number, поэтому вы можете назвать ее как метод для числа (реализация, бесстыдно украденная из Pradeep-ответа):
Number.prototype.toOrdinal = function() {
var n = this.valueOf(),
s = [ 'th', 'st', 'nd', 'rd' ],
v = n % 100;
return n + (s[(v-20)%10] || s[v] || s[0])
}
Пример использования:
var someDay = Math.floor(Math.random() * 31 + 1);
alert(someDay.toOrdinal())
Или вы можете поверить, что Monkey Patching Is Evil; как обычно, YMMV.
(Иногда я называю этот конкретный метод th
, но это работает несколько лучше на языках, где вам не нужны скобки для вызова.)
Добавление объяснения логики. Ключевые моменты, которые зависят от Javascript:
- Оператор
%
возвращает отрицательные результаты для отрицательного дивиденда по модулю положительного делителя (так что -1 % 5
есть -1
; многие другие реализации модуля модуля возвращают только ответы между 0
и n-1
, поэтому -1 % 5
4
).
- Попытка индексации массива значением вне допустимого диапазона индексов (либо отрицательным, либо минусом конца массива) приводит к значению
undefined
, которое является ложным.
Логика использует эти факты для возврата правильного суффикса из компактного выражения с этими частями.
-
Попробуйте получить доступ к s[(v-20)%10]
. Если v
(то есть заданное число по модулю 100) меньше 20, тогда индекс отрицательный, а доступ к массиву возвращает undefined
. В противном случае индекс массива находится между 0 и 9. Значения с 0 по 3 возвращают правильный связанный суффикс ( "th", "st", "nd" и "rd" ), а что-то большее, чем 3, снова возвратит undefined
.
-
Если результат 1 является определенным значением, верните его; в противном случае попробуйте получить доступ к s[v]
. Если v
сам есть 0, 1, 2 или 3, мы снова получаем "th", "st", "nd" или "rd" соответственно. В противном случае мы получаем значение undefined, и выражение переходит к следующей альтернативе.
-
Если ни один из приведенных выше результатов не определен, мы возвращаем s[0]
, который является "th".
В результате все, начиная с 4 по 20, включая 11, 12 и 13, получает "th", а все остальные числа, заканчивающиеся на 1, 2 или 3, получают "st", "nd" и "st", rd "соответственно.
Ответ 3
Ответ Pradeep классный, но что-то более надежное должно проверять значение и делать что-то разумное, если это не подходящее значение для добавления ординала (например, просто вернуть значение), например.
var getOrdinal = (function() {
var re = /^\d+$/;
var ordinal = ["th","st","nd","rd"];
return function (value) {
var t;
if (re.test(String(value))) {
t = value % 100;
return t + (ordinal[(t - 20 % 10)] || ordinal[t] || 'th');
}
return value;
}
}());
getOrdinal( void 0 ); // undefined
getOrdinal( ); // undefined
getOrdinal( NaN ); // NaN
getOrdinal( true ); // true
getOrdinal( 1.0 ); // 1st
getOrdinal( '' ); // '' (empty string)
getOrdinal(Infinity); // Infinity
Ответ 4
npm install ordinal
Работает как в браузере, так и в node. Тогда просто:
var ordinal = require('ordinal')
ordinal(1); //=> '1st'
ordinal(2); //=> '2nd'
ordinal(3); //=> '3rd'
ordinal(4); //=> '4th'
ordinal(11); //=> '11th'
ordinal(12); //=> '12th'
ordinal(13); //=> '13th'
ordinal(21); //=> '21st'
ordinal(22); //=> '22nd'
ordinal(23); //=> '23rd'
ordinal(24); //=> '24th'
https://www.npmjs.com/package/ordinal