【问题标题】:Prevent user from entering a float number, greater than 3 decimals防止用户输入大于 3 位小数的浮点数
【发布时间】:2017-05-26 13:35:07
【问题描述】:

我有一个输入字段,使用这个代码做出反应:

const InputField = props => (
  <div className="input-row">
    <input
      {...props.input}
      type={props.type}
      className="form-control input-box__input"
      placeholder={props.placeholder}
      value={props.value}
      defaultValue={props.defaultValue}
      defaultChecked={props.defaultChecked}
      disabled={props.disabled}
      onChange={props.onChange}
      checked={props.checked}
    />
    {props.meta.touched && props.meta.error &&
    <span className="error">
        {props.intl.formatMessage({ id: props.meta.error }) }
      </span>}
  </div>
);

我想添加一个validation 或更好的preventDefault 属性,这样它就不会让用户输入小数点后三位以上的浮点数。

如果用户输入这样的数字:1.234,它应该阻止用户输入更多的数字,尽管在他的键盘上打字。关于如何实现这一点的任何想法?

【问题讨论】:

  • 到目前为止您尝试过什么?请不要指望我们为您编写代码。提示:我会将纯函数组件转换为类组件并使用onKeyDown 处理程序方法来验证当前输入的值。
  • 我从来没有说过要为我编写代码。我的项目必须在容器中使用无状态组件。
  • 试试input type="number"你可以通过step attribute控制输入大小。这将在浏览器级别上工作,但仅适用于支持此 HTML 元素的那些浏览器。但是为什么要阻止用户使用特定号码呢?无论如何,浮点数将被转换为 32 位
  • 这是必需的验证。我不能让用户输入一个大于三个小数点的数字

标签: javascript validation reactjs precision decimal-point


【解决方案1】:

像其他人建议的那样,使用 onKeyDown 事件来限制输入。快速而肮脏的例子:https://jsfiddle.net/bv9d3bwk/2/

const InputField = props => (
  <div className="input-row">
    <input
      {...props.input}
      type={props.type}
      className="form-control input-box__input"
      placeholder={props.placeholder}
      value={props.value}
      defaultValue={props.defaultValue}
      defaultChecked={props.defaultChecked}
      disabled={props.disabled}
      onChange={props.onChange}
      onKeyDown={this.onKeyDown}
      checked={props.checked}
    />
    {props.meta.touched && props.meta.error &&
    <span className="error">
        {props.intl.formatMessage({ id: props.meta.error }) }
      </span>}
  </div>
);

const onKeyDown = (e) => {
    const decimal_index = e.target.value.indexOf('.');
    if(decimal_index > -1){
        var decimals = e.target.value.substring(decimal_index, e.target.value.length+1);
        if(decimals.length > 4 && e.keyCode !== 8){
           e.preventDefault();
        }
        //this.props.onChange();
    }
}

【讨论】:

  • 我接受它作为答案,但我并不完全正确。当用户输入非十进制数字时,它会阻止他输入更多数字。
  • 好吧,更新了小提琴以允许小数点前的任意数量的数字。 jsfiddle.net/bv9d3bwk/1
  • 太棒了!谢谢:)
  • @user7334203 看了我的 jsfiddle 之后,我不确定我在想什么!大声笑我更新了小提琴,以防止他们在达到最大值后输入任何内容。 jsfiddle.net/bv9d3bwk/2
  • 已更新。 jsfiddle.net/bv9d3bwk/3。对于未来的更改,您只需检查密钥代码并允许您通过任何您想要的内容(输入密钥)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
相关资源
最近更新 更多