2017-07-10 79 views
0

我发现下面的代码在jsfiddle,在我的低劣意见中,它非常好。 但它不格式负数,只有正数。 我试图修改它,但我的正则表达式知识还不够。 任何人都可以帮助我修改此格式的正数和负数吗?使用jquery和regex格式化正数和负数十进制数

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

回答

0

你可以只检查,看看是否该值为负,当你开始,并在末尾添加符号回:

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

}); 

jsfiddle

基本上,在第一REPLACE语句,你加'-'到组字符的被替换,即是不是一个数字或破折号将被替换的一切''在这个新版本。

+0

这解决了这个问题,但我想知道如何用正则表达式来解决这个问题,因为它看起来对我更优雅。 –

+0

更加优雅,谢谢! –