regex 如何在每3位数字后加逗号?

a6b3iqyw  于 2023-03-20  发布在  其他
关注(0)|答案(7)|浏览(118)

这是我的代码的简化:

$("#annual_sales").on('keyup', function () {
    $(this).val( $(this).val().replace(/(\d{3})/g, "$1,") );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="annual_sales" type="text" />

我试着在每3位数字后加一个逗号。

The patterns works well here,但是正如你所看到的 (在上面的代码片段中) 它在JS中不起作用。

slmsl1lt

slmsl1lt1#

在当前的模式(\d{3})中,在匹配3个数字之后以及在3个数字后面已经有一个逗号时添加一个逗号。
您可以使用负lookahead(?!,)匹配3位数字,以Assert后面的内容不是逗号:
(\d{3}(?!,))

$("#annual_sales").on('keyup', function() {
  $(this).val($(this).val().replace(/(\d{3}(?!,))/g, "$1,"));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="annual_sales" type="text" />

如果你不想逗号出现在行尾,你可以在否定前视中使用一个替换,Assert后面的内容既不是逗号,也不是行尾(\d{3}(?!,|$))
一个二个一个一个

hec6srdp

hec6srdp2#

假设您希望从右侧添加这些逗号作为美式数字分隔符,这段代码将通过颠倒添加逗号的前后来实现这一点。

var addCommas = s => s.split('').reverse().join('')
    .replace(/(\d{3})/g, '$1,').replace(/\,$/, '')
    .split('').reverse().join('')  // Really want String.prototype.revese!

$("#annual_sales").on('keyup', function () {
    $(this).val( addCommas($(this).val().replace(/\,/g, '')) );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="annual_sales" type="text" />

(通过转换为数组来做相反的事情,这确实让我想要一个String.prototype.reverse方法。)
如果您必须支持小数位数超过两位的数字,则必须对该函数进行额外的处理。

abithluo

abithluo3#

在这里不起作用,因为事件触发多次,那么你需要删除以前添加的逗号的第一次,每次事件触发,并添加新的位置:

$(this).val().replace(/,/g,'').replace(/(\d{3})/g, "$1,")

**注意:**我建议使用input事件,因为它在跟踪使用输入时更有效,而且您可以调整正则表达式,以便不在行尾添加逗号:

/(\d{3}(?!$))/g

一个二个一个一个

qeeaahzv

qeeaahzv4#

您需要像下面这样预先从值中去除之前添加的“,”。

$("#annual_sales").on('keyup', function () {
    $(this).val($(this).val().replace(new RegExp(",", "g"), ""));
    $(this).val( $(this).val().replace(/(\d{3})/g, "$1,") );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="annual_sales" type="text" />
gr8qqesn

gr8qqesn5#

老实说,我认为最好和最直接的方法来完成这一点是不依赖于直接使用正则表达式替换添加逗号.因为正则表达式运行从左到右,在这种情况下,我们希望从右到左解析,真的没有简单的方法来做到这一点.
相反,我建议使用javascript来完成繁重的工作:

$("#annual_sales").on('keyup', function () {
    var value = $(this).val();
    var match = value.match(/[0-9,.$]+/);    // Match any chars seen in currency
    var new_value = "";
    if (match) {
        var digits = match[0].match(/\d/g);  // Match single digits into an array
        if (digits.length > 3) {
            for (var i = digits.length - 3; i > 0; i = i - 3) {
                // Start at 3 less than the length,
                // continue until we reach the beginning,
                // step down at intervals of 3

                digits.splice(i, 0, ",");    // Insert a comma
            }
            new_value = digits.join("");
            $(this).val(new_value);
        }
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="annual_sales" type="text" />

使用这个函数,您可以扩展它对货币值的处理,比如在值前面加上美元符号,或者在小数点上拆分并强制在小数点后面加上两位数。

**编辑:**斯科特的回答是我在这里建议的一个简短的版本(顺便说一句,非常好)。

v7pvogib

v7pvogib6#

好吧,你可以用这个简单的小把戏:

tooltips: {
    callbacks: {
        label: function(tooltipItem, data) {
            let label = data.labels[tooltipItem.index];
            let value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
            return ' ' + label + ' : ' + value.replace(/(.)(?=(.{3})+$)/g,"$1,");
        }
    }
}
g6baxovj

g6baxovj7#

$("#digits_to_update").on('keyup', function() {
  $(this).val($(this).val().replace(/(\d{3}(?!,))/g, "$1,"));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="digits_to_update" type="text" />`enter code here`
here  '/(\d{3}(?!,))/g, "$1,") ' change the 3 to 4 or 5 it will seperate the number by 4 or 5 too.

相关问题