Javascript 使用jquery和regex设置正数和负数十进制数的格式

Javascript 使用jquery和regex设置正数和负数十进制数的格式,javascript,jquery,regex,currency,number-formatting,Javascript,Jquery,Regex,Currency,Number Formatting,我在下面找到了这段代码,在我看来,这段代码非常好。 但它不格式化负数,只格式化正数。 我试图修改它,但我的正则表达式知识还不够。 有没有人能帮我修改一下正数和负数的格式 $('#valor').keyup(函数(){ var v=$(this.val(); v=v.替换(/\D/g'); v=v.replace(/(\d{1,2})$/,',$1'); v=v.replace(/(\d)(?=(\d{3})+(?!\d))/g,“$1.”); v=v!=“R$”+v:“”; $(此).val(

我在下面找到了这段代码,在我看来,这段代码非常好。 但它不格式化负数,只格式化正数。 我试图修改它,但我的正则表达式知识还不够。 有没有人能帮我修改一下正数和负数的格式

$('#valor').keyup(函数(){
var v=$(this.val();
v=v.替换(/\D/g');
v=v.replace(/(\d{1,2})$/,',$1');
v=v.replace(/(\d)(?=(\d{3})+(?!\d))/g,“$1.”);
v=v!=“R$”+v:“”;
$(此).val(v);

});您可以在开始时检查该值是否为负值,然后在末尾添加重新登录:

$('#valor').keyup(function(){
    let v = $(this).val();
    const neg = v.startsWith('-');

    v = v.replace(/[-\D]/g,'');
    v = v.replace(/(\d{1,2})$/, ',$1');
    v = v.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1.');

    v = v != ''?'$ '+v:'';
    if(neg) v = '-'.concat(v);  // prepend the dash

    $(this).val(v);
});


编辑:这里有一个更“纯”的正则表达式解决方案:

$('#valor').keyup(function(){
    let v = $(this).val();

    v = v.replace(/[^-\d]/g, '');
    v = v.replace(/(\d{1,2})$/g, ',$1');
    v = v.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1.');

    v = v ? '$ ' + v : '';
    $(this).val(v);

});


基本上,在第一个replace语句中,您将
'-'
添加到字符集中以避免被替换,即在新版本中,所有不是数字或破折号的字符都将被
'
替换。

这解决了问题,但我想知道如何使用regex解决这个问题,因为它看起来更优雅。