使用jquery和regex格式化正负十进制数

时间:2017-07-10 17:39:55

标签: javascript jquery regex currency number-formatting

我在jsfiddle下面找到了这个代码,在我的拙劣意见中,这个代码非常好。 但它没有格式化负数,只有正数。 我试图修改它,但我的正则表达式知识还不够。 任何人都可以帮我修改这个以格式化正数和负数吗?

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

1 个答案:

答案 0 :(得分:1)

您可以在开始时检查并查看该值是否为负数,并在最后添加该符号:

scanf

jsfiddle

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

$('#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);
});

jsfiddle

基本上,在第一个替换语句中,您将$('#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); }); 添加到而不是被替换的字符集中,即不是数字或短划线的所有内容都将被替换为这个新版本中'-'