使用 jquery 和正则表达式格式化正负十进制数

Format positive and negative decimal numbers with jquery and regex

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

$('#valor').keyup(function(){
    var v = $(this).val();
    v = v.replace(/\D/g,'');
    v = v.replace(/(\d{1,2})$/, ',');  
    v = v.replace(/(\d)(?=(\d{3})+(?!\d))/g, '.');  
    v = v != '' ? 'R$ '+ v : '';
    $(this).val(v); 
});

你可以在开始的时候检查一下这个值是否为负数,然后在最后重新添加符号:

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

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

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

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

jsfiddle


编辑:这是一个更 "pure" 正则表达式的解决方案:

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

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

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

});

jsfiddle

基本上,在第一个替换语句中,您将 '-' 添加到字符集中 而不是 被替换,即不是数字或字符的所有内容在此新版本中,破折号将被 '' 取代。