将类添加到第n个数字位

时间:2013-04-26 05:55:20

标签: javascript regex number-formatting

有一种很好的方式in this answer可以为页面中的每个数字添加span

var regex = /(\d+)/,
    replacement = '<span>$1</span>';

function replaceText(el) {
    if (el.nodeType === 3) {
        if (regex.test(el.data)) {
            var temp_div = document.createElement('div');
            temp_div.innerHTML = el.data.replace(regex, replacement);
            var nodes = temp_div.childNodes;
            while (nodes[0]) {
                el.parentNode.insertBefore(nodes[0],el);
            }
            el.parentNode.removeChild(el);
        }
    } else if (el.nodeType === 1) {
        for (var i = 0; i < el.childNodes.length; i++) {
            replaceText(el.childNodes[i]);
        }
    }
}

replaceText(document.body);

是否可以在数字的每三位数添加span?我的意思是,不使用Lettering.js。

修改

@ thg435已经回答了这个问题,但我发现他的第二个正则表达式/\d(?=\d\d(\d{3})*\b对我正在研究的阿拉伯数字不起作用。 (阿拉伯数字从“0”开始到“9”,在正则表达式中可以被称为[0-9]。)可能问题出在第二个正则表达式末尾的\b

此外,作为我正在尝试/希望实现的目标的一个示例,١٢٣٤应该变成١<span>٢</span>٣٤

1 个答案:

答案 0 :(得分:1)

如果我理解正确

html = text.replace(/(\d\d)(\d)/g, function($0, $1, $2) {
      return $1 + "<span>" + $2 + "</span>" })

这取代了右边的每三位数字:

> a = "foo 1234567890 bbb 123456"
"foo 1234567890 bbb 123456"
> a.replace(/\d(?=\d\d(\d{3})*\b)/g, "[$&]")
"foo 1[2]34[5]67[8]90 bbb [1]23[4]56"

对于阿拉伯数字,请考虑:

String.prototype.reverse = function() { return this.split("").reverse().join("") }
result = str.replace(/[\u0660-\u0669]+/g, function(s) {
    return s.
        reverse().
        replace(/(..)(.)/g, "$1aaa$2zzz").
        reverse().
        replace(/zzz(.)aaa/g, "<span>$1</span>")
})

这很麻烦,但似乎有效:http://jsfiddle.net/VSTJs/2/