2015-08-13 159 views
0

對於我的商業Web應用程序,我希望用戶只能在文本框中輸入有效貨幣值。Javascript貨幣正則表達式替換

目前我使用

$input.val($input.val().replace(/[^.\d]/g, '')); 

但這並不考慮順序或多個小數點分隔符服用。

因此,用戶要麼必須輸入完整的整數或一個有效的十進制值,例如:

  • 49.50

獎勵分,如果這是允許過:

  • .50(對於0.50)

所以我不想驗證,我想限制打字到文本框中。這是可能的一個單一的正則表達式替換?

+0

http://igorescobar.github.io/jQuery-Mask-Plugin/ – sinisake

+0

我不希望使用任何屏蔽插件此。是的,我需要Safari支持。 – Basaa

+1

將用戶輸入的內容混淆起來會更不友好,讓用戶知道該字段的值是否不符合驗證要求。用戶可能會犯錯誤,但他們不是無腦或無法正確輸入貨幣值。 – RobG

回答

0

我們可以分兩步來做到這一點。限制用戶僅輸入數字字符和.字符。

var charCode = (evt.which) ? evt.which : event.keyCode 
if (charCode < 31 && (charCode > 48 || charCode < 57)) 
    return true; 
return false; 

和下一個是允許.

var charCode = (evt.which) ? evt.which : event.keyCode 
if (charCode == 46 && (charCode > 31 && (charCode < 48 || charCode > 57))) 
    return true; 
return false; 

下一步將不允許雙句點。

var charCode = (evt.which) ? evt.which : event.keyCode 
if (charCode == 46 && (charCode > 31 && (charCode < 48 || charCode > 57))) 
    if (charCode == 46 && value.indexOf(".") !== false) 
     return true; 
return false; 

希望你能以此爲出發點。

片段

開放新政:如果你可以打破它。

function check(inp) { 
 
    var charCode = (event.which) ? event.which : event.keyCode; 
 
    console.log(charCode); 
 
    if (charCode == 8) 
 
    return true; 
 
    if ((charCode > 46 && charCode < 58) || (charCode > 95 && charCode < 106) || charCode == 110 || charCode == 190) 
 
    if (charCode == 110 || charCode == 190) 
 
     if (inp.value.indexOf(".") == -1) 
 
     return true; 
 
     else 
 
     return false; 
 
    else 
 
     return true; 
 
    return false; 
 
}
<input type="text" onkeydown="return check(this);" />

+0

最好查看輸入的實際字符而不是字符代碼。無需按任何鍵即可輸入數值。 – RobG

+0

是的。但我們可以禁用粘貼。 @RobG –

+0

你爲什麼要禁用粘貼? –

0

它更人性告知錯誤的,並讓用戶解決他們自己。您可能會考慮使用keyup事件,但在用戶有機會輸入有效值之前提早顯示錯誤也可能會令人討厭。例如

function validate(el) { 
 
    var type = el.className; 
 
    var errEl = document.getElementById(el.name + 'Err'); 
 
    if (type == 'typeCurrency') { 
 
    var currencyRe = /^-?(\d+(\.\d{1,2})?|\.\d{1,2})$/; 
 
    errEl.style.visibility = currencyRe.test(el.value)? 'hidden' : 'visible'; 
 
    } 
 
}
.errorMessage { 
 
    color: red; 
 
    background-color: white; 
 
    visibility: hidden; 
 
    }
Cost&nbsp;<input onblur="validate(this)" name="foo" class="typeCurrency" placeholder="0.00"><br> 
 
<span id="fooErr" class="errorMessage">Please enter a valid cost, e.g. 2.45</span>