2017-07-10 26 views
0

このコードはjsfiddleにありますが、これは私のすごい意見では非常にいいと思います。 しかし、正の数だけ負の数はフォーマットされません。 私はそれを修正しようとしましたが、私の正規表現の知識は十分ではありませんでした。 これを修正して正と負の数値をフォーマットするのに役立つ人はいますか?jqueryと正規表現の正と負の10進数の書式

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

基本的には、最初の置き換え声明の中で、あなたは、置き換えられてしまいます数字またはダッシュではありませんつまり、すべてを置き換えますないに文字のセットに'-'を追加しますこの新しいバージョンでは''です。

+0

これは問題を解決しますが、正規表現でこれを解決する方法を知りたがっています。なぜなら、それはもっと優雅に見えるからです。 –

+0

非常にエレガントな、ありがとう! –