【问题标题】:Javascript currency regular expression replaceJavascript货币正则表达式替换
【发布时间】:2015-08-13 22:49:48
【问题描述】:

对于我的业务 Web 应用程序,我希望用户只能在文本框中输入有效的货币值。

目前我使用

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

但这没有考虑顺序或多个小数分隔符。

所以用户要么必须输入一个整数或一个有效的十进制值,例如:

  • 49
  • 49.50

如果允许也可以加分:

  • .50(对于 0.50)

所以我不想验证,我想限制在文本框中输入。这可以通过单个正则表达式替换吗?

【问题讨论】:

  • 我不想为此使用任何屏蔽插件。是的,我确实需要 Safari 支持。
  • 乱打用户输入的内容被认为是不礼貌的,如果字段的值不符合验证要求,让用户知道更友好。用户可能会犯错误,但他们并非无脑或无法正确输入货币价值。
  • @RobG 感谢您在这里发言。

标签: javascript regex input replace currency


【解决方案1】:

我们可以分两步完成。限制用户只能输入数字字符和. 字符。

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;
}
&lt;input type="text" onkeydown="return check(this);" /&gt;

【讨论】:

  • 查看实际键入的字符而不是字符代码更好。无需按任何键即可输入值。
  • 是的。但是我们可以禁用粘贴。 @RobG
  • 为什么要禁用粘贴?
  • @maček——因为删除用户功能比为其编程更容易。 :-/
  • 伙计们,添加了一个 sn-p。如果可以的话,打破它! :)
【解决方案2】:

提示错误并让用户自行修复更方便用户。您可能会考虑使用 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多