Javascript:具有特定CSS类的数字的序号后缀
我试图用序号后缀在特定表中显示数字。该表始终显示来自XML文件的三个数字。这些数字显示等级,例如,它们可能是第6、120、131位。输出是一个如下所示的表:Javascript:具有特定CSS类的数字的序号后缀,javascript,jquery,ordinals,Javascript,Jquery,Ordinals,我试图用序号后缀在特定表中显示数字。该表始终显示来自XML文件的三个数字。这些数字显示等级,例如,它们可能是第6、120、131位。输出是一个如下所示的表: <table> <tr> <td class='ordinal'>6</td> <td class='ordinal'>120</td> <td class='ordinal'>131</td&g
<table>
<tr>
<td class='ordinal'>6</td>
<td class='ordinal'>120</td>
<td class='ordinal'>131</td>
</tr>
</table>
<script type="text/javascript">
$(function(){
$(".ordinal").each(function(){
var j = i % 10;
if (j == 1 && i != 11) {
return i + "st";
}
if (j == 2 && i != 12) {
return i + "nd";
}
if (j == 3 && i != 13) {
return i + "rd";
}
return i + "th";
});
})
</script>
6.
120
131
我很想使用javascript,例如,我在stackoverflow上找到了一些非常好的解决方案。但是,我很难将该函数应用于表中的所有数字,而不是单独输入每个数字。我尝试使用CSS类,因此我的函数如下所示:
<table>
<tr>
<td class='ordinal'>6</td>
<td class='ordinal'>120</td>
<td class='ordinal'>131</td>
</tr>
</table>
<script type="text/javascript">
$(function(){
$(".ordinal").each(function(){
var j = i % 10;
if (j == 1 && i != 11) {
return i + "st";
}
if (j == 2 && i != 12) {
return i + "nd";
}
if (j == 3 && i != 13) {
return i + "rd";
}
return i + "th";
});
})
</script>
$(函数(){
$(“.ordinal”).each(function(){
var j=i%10;
如果(j==1&&i!=11){
返回i+“st”;
}
如果(j==2&&i!=12){
返回i+“nd”;
}
如果(j==3&&i!=13){
返回i+“rd”;
}
返回i+“th”;
});
})
但它不起作用,可能是因为我把代码搞砸了。也许这里有人能帮我,告诉我哪里出了错
非常感谢你的帮助 它不起作用,因为您正在将字符串返回到
$。每个,而不是实际使用它们。用法取决于HTML,但下面是一个将.ordinal
文本设置为该值的示例
您还缺少事件处理程序上的i
参数,您可以增加i
以从1st
开始,而不是从0th
开始
如果元素中已经有数字,那么最好不要依赖索引,而是检查数字,然后将字符串追加到末尾
我个人的建议是:
$(".ordinal").text(function (i, t) {
i++;
var str = i.toString().slice(-1),
ord = '';
switch (str) {
case '1':
ord = 'st';
break;
case '2':
ord = 'nd';
break;
case '3':
ord = 'rd';
break;
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
ord = 'th';
break;
}
return i + ord;
});
这将有效地获取递增的数字(i++
,以便从1
开始,而不是0
),将其转换为字符串,然后查看该字符串的最后一个数字。这适用于任何数字,因为序数完全基于最后一个数字
您还可以扩展Number
原型以实现此功能:
Number.prototype.ordinate = function(){
var num = this + 1,
last = num.toString().slice(-1),
ord = '';
switch (last) {
case '1':
ord = 'st';
break;
case '2':
ord = 'nd';
break;
case '3':
ord = 'rd';
break;
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
ord = 'th';
break;
}
return num.toString() + ord;
};
$(".ordinal").text(function (i, t) {
return i.ordinate();
});
经过编辑,提供了一个轻微的替代方案:
Number.prototype.ordinate = function(){
var num = this,
last = num.toString().slice(-1),
ord = '';
switch (last) {
case '1':
ord = 'st';
break;
case '2':
ord = 'nd';
break;
case '3':
ord = 'rd';
break;
default:
ord = 'th';
break;
}
return num.toString() + ord;
};
$(".ordinal").text(function (i,t) {
return t.replace(/(\d+)/g, function(a){
return parseInt(a, 10).ordinate();
});
});
这实际上是在每个.ordinal
元素上迭代,用添加了序号后缀的(相同)数字替换当前的数字
编辑以解决以下评论中提出的问题,即11
、12
和13
分别接收顺序后缀st
、nd
和rd
。现在,在所有情况下,这被更正为th
:
Number.prototype.ordinate = function(){
var num = this,
numStr = num.toString(),
last = numStr.slice(-1),
len = numStr.length,
ord = '';
switch (last) {
case '1':
ord = numStr.slice(-2) === '11' ? 'th' : 'st';
break;
case '2':
ord = numStr.slice(-2) === '12' ? 'th' : 'nd';
break;
case '3':
ord = numStr.slice(-2) === '13' ? 'th' : 'rd';
break;
default:
ord = 'th';
break;
}
return num.toString() + ord;
};
参考资料:
函数n(n){
if(isNaN(n)| n%1)返回n;
var s=n%100;
如果(s>3&&s一行中的顺序后缀
var integerWithSuffix=originalInteger+(['st','nd','rd'][( originalInteger +'').match(/1?\d\b/)-1]||'th');
原始数字和一个字符串的串联,该字符串表示从一个数组中派生的序号,该数组由对该数字的正则表达式搜索结果索引
根据大卫·托马斯的回答,我会这样做:
Number.prototype.ordinate = function(){
var num = this,
ones = num % 10, //gets the last digit
tens = num % 100, //gets the last two digits
ord = ["st","nd","rd"][ tens > 10 && tens < 20 ? null : ones-1 ] || 'th';
return num.toString() + ord;
};
我创建了两种方法,一种是使用原型,另一种是作为插件:
Number.prototype.between = function(n,m){ return this > n && this < m }
Number.prototype.ORDINATE_INDEX = ["th","st","nd","rd"];
Number.prototype.toOrdinate = function(){
var
nthMod = (this % 10),
index = nthMod > 3 || this.between(10,20) ? 0 : nthMod
;
return this + this.ORDINATE_INDEX[index];
};
$(".ordinal").text(function (index, element) {
return parseInt(element).toOrdinate();
});
Number.prototype.between=函数(n,m){返回this>n&&this3 | |这个。介于(10,20)之间?0:nthMod
;
返回this+this.纵坐标索引[INDEX];
};
$(“.ordinal”).text(函数(索引,元素){
返回parseInt(element.toOrdinate();
});
这是一个Jquery插件:
(function($){
var numberTool = new (function(){
var private = {};
private.ORDINATE_INDEX = ["th","st","nd","rd"];
private.parseOrdinary = function(number)
{
var
nthMod = (number % 10),
index = nthMod > 3 || private.between(number, 10,20) ? 0 : nthMod
;
return number + private.ORDINATE_INDEX[index];
}
private.between = function(number, n,m){
return number > n && number < m
}
this.isNumeric = function(number)
{
return !isNaN(parseFloat(number)) && isFinite(number);
}
this.toOrdinary = function(number)
{
return this.isNumeric(number) ? private.parseOrdinary(number) : number;
}
});
$.fn.toOrdinary = function(){
return this.each(function(){
$element = $(this);
$element.text(numberTool.toOrdinary($element.text()));
});
};
})(jQuery);
$(".ordinal").toOrdinary();
$(".ordinal").toOrdinary();
$(".ordinal").toOrdinary();
(函数($){
var numberTool=new(函数(){
var private={};
private.ordination_INDEX=[“th”、“st”、“nd”、“rd”];
private.parseNormal=函数(编号)
{
变量
nthMod=(编号%10),
index=nthMod>3 | | private.between(数字,10,20)?0:nthMod
;
返回编号+专用.纵坐标索引[索引];
}
private.between=函数(数字,n,m){
返回编号>n&&编号
在JSFIDLE上测试:
原型版本示例:
JQuery版本示例:函数ordsfx(a){return[“th”,“st”,“nd”,“rd”][(a=~(a10&&a3?0:a)]}
请参见第页的注释版本
短小、甜美、高效,就像实用程序函数一样。适用于任何有符号/无符号整数/浮点。(尽管我无法想象需要对浮点进行排序)这就是我所使用的,适用于任何年份、月份、日期(闰年)包括:
// panelyear, panelmonth and panelday are passed as parameters
var PY01 = parseInt(panelyear); var PM01 = (parseInt(panelmonth) - 1); PD01 = parseInt(panelday);
var now = new Date(PY01, PM01, PD01);
var start = new Date(PY01, 0, 0);
var diff = (now - start) + ((start.getTimezoneOffset() - now.getTimezoneOffset()) * 60 * 1000);
var oneDay = 1000 * 60 * 60 * 24;
var day = Math.floor(diff / oneDay);
function getNumberWithOrdinal(n) { var s = ["th","st","nd","rd"], v = n % 100; return n + (s[(v - 20) % 10] || s[v] || s[0]); }
配合使用
<script> document.write(getNumberWithOrdinal(day)); </script>
document.write(getNumberWithOrdinal(day));
太棒了,谢谢,这很有效!但是,现在我遇到了一个问题,即每个数字,例如132,都返回为第17位,而不是第132位。我的数字增加到200多位。你知道错误的根源吗?对我来说很好。你在代码中遗漏了什么吗?啊,我在看到I++之前问了这个问题,对不起。但是,没有返回这是简单的第一、第二、第三个数字,不是第17、第132、第146个数字。我通过一个XML文档输入这些数字,以防万一,这会产生不同!那么代码
// panelyear, panelmonth and panelday are passed as parameters
var PY01 = parseInt(panelyear); var PM01 = (parseInt(panelmonth) - 1); PD01 = parseInt(panelday);
var now = new Date(PY01, PM01, PD01);
var start = new Date(PY01, 0, 0);
var diff = (now - start) + ((start.getTimezoneOffset() - now.getTimezoneOffset()) * 60 * 1000);
var oneDay = 1000 * 60 * 60 * 24;
var day = Math.floor(diff / oneDay);
function getNumberWithOrdinal(n) { var s = ["th","st","nd","rd"], v = n % 100; return n + (s[(v - 20) % 10] || s[v] || s[0]); }
<script> document.write(getNumberWithOrdinal(day)); </script>