1 ~ 31 の値を取得して、1 番目、2 番目、3 番目などに変換する JavaScript コード スニペットはありますか?
ありがとう!
1 ~ 31 の値を取得して、1 番目、2 番目、3 番目などに変換する JavaScript コード スニペットはありますか?
ありがとう!
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
関数を 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 % 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」を取得します。それ以外の場合、未定義の値を取得し、式は次の選択肢に進みます。
上記の結果のどちらも定義されていない場合、s[0]
「th」である を返します。
その結果、11、12、および 13 を含む 4 から 20 までのすべての数字が「th」になり、1、2、または 3 で終わる他のすべての数字は「st」、「nd」、および「rd」になります。それぞれ。
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
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'