如何仅允许文本框中的数字和格式作为反应js中的美国移动数字格式?例如:(224) - 5623 -2365

时间:2017-03-31 06:47:14

标签: reactjs validation material-ui

我正在使用React进行手机号码验证。 TextField应仅允许数字,并将格式化为美国移动数字格式。我限制只允许数字,但格式没有发生。我正在使用material-ui进行验证。在我的代码下面。

import React from 'react';
import TextField from '@material-ui/core/TextField';

export default class myClass extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            value: '',
        };
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(e) {
        const re = /[0-9]+/g;
        if (e.target.value === '' || re.test(e.target.value)) {
            this.setState({ value: e.target.value });
        }
    }
    render() {
        return (
            <div>
                <TextField
                    floatingLabelText="mobileNumber"
                    onChange={this.handleChange}
                    value={this.state.value}
                />
            </div>
        );
    }
}

4 个答案:

答案 0 :(得分:4)

我已将文本框限制为仅允许数字,并将手机号码格式化为美国手机号码格式。请遵循以下代码。

handleChange(e) {
    const onlyNums = e.target.value.replace(/[^0-9]/g, '');
    if (onlyNums.length < 10) {
        this.setState({ value: onlyNums });
    } else if (onlyNums.length === 10) {
        const number = onlyNums.replace(
            /(\d{3})(\d{3})(\d{4})/,
            '($1) $2-$3'
        );
        this.setState({ value: number });
    }
}

答案 1 :(得分:2)

import Input from '@material-ui/core/Input';

改为使用<Input type="number" />

答案 2 :(得分:0)

在您的文本字段上设置类:

<TextField type="number"
    inputProps={{className:'digitsOnly'}}
    floatingLabelText="mobileNumber"
    value={this.state.value}
    onChange={this.handleChange}
    id={"mobileNumber"} name={"mobileNumber"}
/>

您可以在文本字段上应用仅启用数字的类,如下所示:

$(".digitsOnly").on('keypress',function (event) {
    var keynum
    if(window.event) {// IE8 and earlier
       keynum = event.keyCode;
    } else if(event.which) { // IE9/Firefox/Chrome/Opera/Safari
       keynum = event.which;
    } else {
       keynum = 0;
    }

    if(keynum === 8 || keynum === 0 || keynum === 9) {
       return;
    }
    if(keynum < 46 || keynum > 57 || keynum === 47) {
       event.preventDefault();
    } // prevent all special characters except decimal point
}

限制在文本字段上的拖放:

$(".digitsOnly").on('paste drop',function (event) {
    let temp=''
    if(event.type==='drop') {
        temp =$("#mobileNumber").val()+event.originalEvent.dataTransfer.getData('text');
        var regex = new RegExp(/(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)/g); //Allows only digits to be drag and dropped
        if (!regex.test(temp)) {
           event.preventDefault();
           return false;
        }
    } else if(event.type==='paste') {
        temp=$("#mobileNumber").val()+event.originalEvent.clipboardData.getData('Text')
        var regex = new RegExp(/(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)/g); //Allows only digits to be pasted
        if (!regex.test(temp)) {
           event.preventDefault();
           return false;
        }
    }
}

在页面加载后立即在componentDidMount()中调用这些事件以应用该类。

答案 3 :(得分:0)

如果您使用像 react-hook-form 这样的表单验证库,您可以验证 你这样的文本框,

<TextField
     name="index"
     InputProps={{ inputMode: 'numeric', pattern: '[0-9]*' }}
     inputRef={register({
         required: {
             value: true,
             message: 'Please fill this field',
         },
         pattern: {
             value: /^[1-9]\d*(\d+)?$/i,
             message: 'Please enter an integer',
         },
         min: {
             value: 1,
             message: 'Value should be atleast 1',
         },
   })}
   error={errors?.index ? true : false}
   helperText={errors?.index?.message}
/>