12

1 ~ 31 の値を取得して、1 番目、2 番目、3 番目などに変換する JavaScript コード スニペットはありますか?

ありがとう!

4

4 に答える 4

22
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
于 2012-09-19T01:40:05.263 に答える
3

関数を 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())

または、モンキーパッチは悪だと信じているかもしれません。いつものYMMV。

(私はこの特定のメソッドを と呼ぶこともthありますが、呼び出しに括弧が必要ない言語では、この方法の方がいくらかうまく機能します。)

ロジックの説明を追加します。JavaScript 固有の重要なポイント:

  1. %演算子は、正の除数を法とする負の被除数に対して負の結果を返します (そうです-1 % 5;剰余演算子の他の多くの実装はと-1の間の答えのみを返すので、そうです)。 0n-1-1 % 54
  2. インデックスの有効な範囲外 (負の値または配列の末尾を超えた値) で配列のインデックスを作成しようとすると、誤ったundefined値が返されます。

ロジックはこれらの事実を利用して、これらの部分を含むコンパクトな式から正しい接尾辞を返します。

  1. にアクセスしてみてくださいs[(v-20)%10]v(100 を法とする指定された数値) が 20 未満の場合、インデックスは負になり、配列アクセスは を返しますundefined。それ以外の場合、配列インデックスは 0 ~ 9 です。値 0 ~ 3 は、関連付けられた正しい接尾辞 ("th"、"st"、"nd"、および "rd") を返しますが、3 より大きい値は再び を返しundefinedます。

  2. 1 の結果が定義済みの値である場合は、それを返します。それ以外の場合は、にアクセスしてみてくださいs[v]v自体が 0、1、2、または 3 の場合、それぞれ「th」、「st」、「nd」、または「rd」を取得します。それ以外の場合、未定義の値を取得し、式は次の選択肢に進みます。

  3. 上記の結果のどちらも定義されていない場合、s[0]「th」である を返します。

その結果、11、12、および 13 を含む 4 から 20 までのすべての数字が「th」になり、1、2、または 3 で終わる他のすべての数字は「st」、「nd」、および「rd」になります。それぞれ。

于 2012-09-19T02:25:34.187 に答える
1

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
于 2012-09-19T03:59:48.390 に答える
0
npm install ordinal

ブラウザとノードの両方で動作します。それからちょうど:

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

于 2015-12-31T22:23:21.027 に答える