2017-07-10 26 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

更加優雅,謝謝! –