Подтвердить что ты не робот

Возьмите значение 1-31 и преобразуйте его в порядковый номер с JavaScript

Есть ли фрагмент кода JavaScript, чтобы принять значение 1-31 и преобразовать его в 1, 2, 3 и т.д.?

Спасибо!

4b9b3361

Ответ 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