숫자 만 허용하는 React Native TextInput


106

TextInput숫자 (0-9) 만 입력 할 수 있는 React Native 구성 요소 가 필요합니다 . 나는 설정할 수 keyboardType에 numeric거의 기간을 제외하고 입력 저를 얻을 수있는을 (.). 그러나 이것은 숫자가 아닌 문자를 필드에 붙여 넣는 것을 중단하지 않습니다.

지금까지 내가 생각 해낸 것은 OnChangeText이벤트를 사용하여 입력 된 텍스트를 보는 것입니다. 텍스트에서 숫자가 아닌 문자를 제거합니다. 그런 다음 상태 필드에 텍스트를 입력합니다. 그런 다음 업데이트 TextInput그것의를 통해 Value속성입니다. 아래 코드 스 니펫.

<TextInput 
  style={styles.textInput}
  keyboardType = 'numeric'
  onChangeText = {(text)=> this.onChanged(text)}
  value = {this.state.myNumber}
/> 

onTextChanged(text) {
  // code to remove non-numeric characters from text
  this.setState({myNumber: text})
}

이것은 작동하는 것처럼 보이지만 해킹처럼 보입니다. 이를 수행하는 다른 방법이 있습니까?


이 예제가 작동하지 않았습니다. 다른 방법으로 해결할 수 있었습니까?
— amb


React Native 0.54부터 여기에 제안 된 대부분의 답변이 깨졌습니다. github.com/facebook/react-native/issues/18874 (작성 당시 최신 버전 인 0.56 이상).
— Tomty

1
@sumitkumarpradhan 해당 블로그 게시물은 실제로 텍스트 입력을 방지하지 않는 '숫자'로 키보드 유형을 설정하도록 제안합니다. 원하는 것을 복사하여 붙여 넣을 수 있습니다.
— jmathew 19

keyboardType='numeric'TextInput에서 prop을 사용하여 숫자 키보드 (duh) 만 표시하고 text.replace(/[^0-9]/g, '')아래에 제안 된대로 텍스트를 정규식 으로 대체하여 누군가가 TextInput 내부에 문자열을 붙여 넣는 것을 방지합니다. 잘 작동되어 지금까지의 기본 v0.62 반작용
— keshavDulal

답변:


30

이는 그러한 구성 요소 (또는 TextInput의 속성)가 특별히 개발 될 때까지이를 수행하는 올바른 방법입니다.

웹에는 입력 요소에 대한 '숫자'유형이 있지만 웹 기반이며 react-native는 웹보기를 사용하지 않습니다.

해당 입력을 자체적으로 반응 구성 요소로 만드는 것을 고려할 수 있습니다 (NumberInput 호출 일 수 있음) : 다른 값 필터 / 체커를 가진 많은 TextInput을 만들 수 있기 때문에이를 재사용하거나 오픈 소스로 만들 수 있습니다.

즉각적인 수정의 단점은 자신의 가치에 무슨 일이 일어 났는지에 대한 혼란을 방지하기 위해 사용자에게 올바른 피드백을 제공하는 것입니다.


국가 코드로 어떻게 설정할 수 있습니까? (예) 텍스트 입력 구성 요소의 소품으로 국가 코드를 설정할 수
— 있습니까

107

RegExp를 사용하여 숫자가 아닌 것을 대체하는 것이 다른 답변과 마찬가지로 화이트리스트와 함께 for 루프를 사용하는 것보다 빠릅니다.

onTextChange 핸들러에 이것을 사용하십시오.

onChanged (text) {
    this.setState({
        mobile: text.replace(/[^0-9]/g, ''),
    });
}

성능 테스트 : https://jsperf.com/removing-non-digit-characters-from-a-string


이 방법을 사용하여 영어 알파벳 문자 만 허용하려면 어떻게해야합니까?
— CraZyDroiD

2
@CraZyDroiD는 정규식을 조정합니다. 만 AZ 일치하려는 경우, 당신은 같은 것을해야합니다text.replace(/[^A-Za-z]/g, '')
— 제이크 테일러

1
또한 keyboardType='numeric'Prop을 TextInput 필드에 전달 합니다.
— keshavDulal

94

이렇게 할 수 있습니다. 숫자 값만 허용되며 원하는대로 10 개 숫자로 제한됩니다.

<TextInput 
   style={styles.textInput}
   keyboardType='numeric'
   onChangeText={(text)=> this.onChanged(text)}
   value={this.state.myNumber}
   maxLength={10}  //setting limit of input
/>

페이지에 다음 코드를 작성하여 입력 된 값을 볼 수 있습니다.

{this.state.myNumber}

onChanged () 함수에서 코드는 다음과 같습니다.

onChanged(text){
    let newText = '';
    let numbers = '0123456789';

    for (var i=0; i < text.length; i++) {
        if(numbers.indexOf(text[i]) > -1 ) {
            newText = newText + text[i];
        }
        else {
            // your call back function
            alert("please enter numbers only");
        }
    }
    this.setState({ myNumber: newText });
}

다른 사람들에게 도움이되기를 바랍니다.


작은 수정 : onChanged (text) {var newText = ''; var numbers = '0123456789'; if (text.length <1) {this.setState ({myNumber : ''}); } for (var i = 0; i <text.length; i ++) {if (numbers.indexOf (text [i])> -1) {newText = newText + text [i]; } this.setState ({myNumber : newText}); }}
— Bheru Lal Lohar

1
좋은 답변,하지만 당신은 숫자 '9'싫어 않는 이유
— 스탠리 루오

21
7은 9를 싫어하기 때문에?
— boatcoder

4
그래도 깜박임을 방지 할 수 있습니까?
— Waltari

당신은 최고의 친구들입니다
— Khadam Ikhwanus

18

React Native TextInput은 다음과 같은 가능한 값으로 keyboardType 소품을 제공합니다. 기본 숫자 패드 십진수 패드 숫자 이메일 주소 전화 패드

따라서 귀하의 경우에는 숫자 만 받아들이 기 위해 keyboardType = 'number-pad'를 사용할 수 있습니다. 여기에는 '.'가 포함되지 않습니다.

그래서,

<TextInput 
  style={styles.textInput}
  keyboardType = 'number-pad'
  onChangeText = {(text)=> this.onChanged(text)}
  value = {this.state.myNumber}
/>

귀하의 경우에 사용해야하는 것입니다.

자세한 내용은 TextInput에 대한 공식 문서 링크를 참조하십시오 : https://facebook.github.io/react-native/docs/textinput#keyboardtype


10

입력을 확인하는 기능 :

validateInputs(text, type) {
let numreg = /^[0-9]+$/;
  if (type == 'username') {
    if (numreg.test(text)) {
      //test ok
    } else {
      //test not ok
    } 
  }
}



<TextInput
   onChangeText={text => this.validateInputs(text, 'username')}
/>

도움이 되었기를 바랍니다.


더 효율적인 방법입니다. 루핑 방법 대신 따라야합니다
— Asif Ali

10

정규식을 사용하는 숫자 만 허용

<TextInput 
  keyboardType = 'numeric'
  onChangeText = {(e)=> this.onTextChanged(e)}
  value = {this.state.myNumber}
/> 

onTextChanged(e) {
  if (/^\d+$/.test(e.toString())) { 
    this.setState({ myNumber: e });
  }
}

둘 이상의 유효성 검사를 원할 수 있습니다.


<TextInput 
  keyboardType = 'numeric'
  onChangeText = {(e)=> this.validations(e)}
  value = {this.state.myNumber}
/> 

numbersOnly(e) {
    return /^\d+$/.test(e.toString()) ? true : false
}

notZero(e) {
    return /0/.test(parseInt(e)) ? false : true
}

validations(e) {
    return this.notZero(e) && this.numbersOnly(e)
        ? this.setState({ numColumns: parseInt(e) })
        : false
}


이 첫 번째 두 가지 기능을 만들 필요가, 당신은 사용할 수 없습니다 :validations(value: string) { return /0/.test(value) && /^\d+$/.test(value) ? this.setState({ numColumns: value }) : false; }
— Frederiko 세자르

2
@FrederikoCesar 단일 책임 원칙 살펴보기
— jasonleonhard

10

첫 번째 솔루션

keyboardType = 'numeric'숫자 키보드로 사용할 수 있습니다 .

  <View style={styles.container}>
        <Text style={styles.textStyle}>Enter Number</Text>
        <TextInput
          placeholder={'Enter number here'}
          style={styles.paragraph}
          keyboardType="numeric"
          onChangeText={value => this.onTextChanged(value)}
          value={this.state.number}
        />
      </View>

첫 번째 경우에는 구두점이 포함됩니다. 예 :- . 그리고 -

두 번째 솔루션

구두점을 제거하려면 정규식을 사용하십시오.

 onTextChanged(value) {
    // code to remove non-numeric characters from text
    this.setState({ number: value.replace(/[- #*;,.<>\{\}\[\]\\\/]/gi, '') });
  }

스낵 링크를 확인하세요

https://snack.expo.io/@vishal7008/numeric-keyboard


8

"onChangeText"가 iOS에서 예상대로 TextInput 값을 변경할 수 없다는 문제를 겪은 사람들에게 알림 : 이것은 실제로 ReactNative의 버그이며 버전 0.57.1에서 수정되었습니다. 참조 : https://github.com/facebook/react-native/issues/18874


이 코멘트가 아닌 대답해야한다
— 하리스 나딤

1
질문에 대해 언급 할만한 평판이 충분하지 않다는 점에 대해 사과하여 답변을 드리고 실행 가능한 솔루션을 찾는 사람들에게 관심을 끌 수 있기를 바랍니다.
— Wing

공정한 포인트. 댓글을 달려면 평판 50 개가 필요합니다. 안타깝게도이 제한을 제거 할 수는 없지만 10 개의 평판을 제공하고 일부 제한을 제거 할 수 있습니다.
— 하리스 나딤

이 10 개의 코멘트 조항을 얻기 위해 수행 ... 건배 @Wing
— Venkatesh 소무

감사합니다 :) @VenkateshSomu
— Wing

4
<TextInput autoCapitalize={'none'} maxLength={10} placeholder='Mobile Number'  value={this.state.mobile} onChangeText={(mobile) => this.onChanged(mobile)}/>

및 onChanged 메소드 :

onChanged(text){
   var newText = '';
   var numbers = '0123456789';
   if(text.length < 1){
     this.setState({ mobile: '' });
   }
   for (var i=0; i < text.length; i++) {
        if(numbers.indexOf(text[i]) > -1 ) {
             newText = newText + text[i];
        }
        this.setState({ mobile: newText });
    }
}

귀하의 솔루션은 내 문제를 해결했지만 경고를 생성합니다.이 문제로 "This synthetic event is reused for performance reasons. If you're seeing this, you're accessing the property 'type' on a released/nullified synthetic event. This is set to null. If you must keep the original synthetic event around, use event.persist(). See fb>react-event-pooling for more information."무엇을해야할지 모르겠습니다. 도울 수 있니?
— Mike

이 문제를 일으키는 일부 이벤트 세력 @ 마이크, 당신은 jsfiddle 또는 rnplay.org를 통해 구성 요소 코드를 공유 할 수 있습니다
— Bheru 랄 Lohar

나는 여기에 주석을 달고 얼마 지나지 않아 그것을 해결했지만 불행히도 문제가 무엇인지 파악할 수 있습니다.
— Mike

정규식을 사용하는 것은 현명한 선택이 될 것입니다
— 아시프 알리

4

iOS에서 동일한 문제가 발생했습니다. onChangeText 이벤트를 사용하여 사용자가 입력 한 텍스트의 값을 업데이트했습니다. TextInput의 값을 업데이트 할 수 없었기 때문에 사용자가 입력 한 숫자가 아닌 문자를 계속 볼 수있었습니다.

이것은 숫자가 아닌 문자를 눌렀을 때 this.setState가 동일한 숫자 (숫자가 아닌 문자를 제거한 후에 남아있는 숫자)를 사용하고 TextInput이 다시 렌더링되지 않기 때문에 상태가 변경되지 않기 때문입니다.

이 문제를 해결하기 위해 찾은 유일한 방법은 onChangeText 이벤트 이전에 발생하는 keyPress 이벤트를 사용하는 것이었고, 그 안에서 setState를 사용하여 상태 값을 완전히 다른 다른 값으로 변경하여 onChangeText 이벤트가 호출 될 때 다시 렌더링되도록했습니다. . 이것에별로 만족 스럽지는 않지만 효과가있었습니다.


4
if (!/^[0-9]+$/.test('123456askm')) {
  consol.log('Enter Only Number');
} else {
    consol.log('Sucess');
}

! / ^ [0-9] + $ /. test ( '123456askm') 입력 문자열이 숫자인지 아닌지 확인합니다. .test (Your Value)
— ANKIT DETROJA

1
안녕하세요, 이것이 OP 문제에 대한 해결책 인 이유에 대한 답변을 확장하십시오. 이것은 OP와 사이트의 미래 방문자를 도울 것입니다. 감사!
— d_kennetz

3

사용자가 내가 받아들이고 자하는 것 이외의 다른 것을 입력하는 것을 방지하는 데 도움이되는이 기능을 작성했습니다. 나는 또한 keyboardType="decimal-pad"나의onChangeText={this.decimalTextChange}

  decimalTextChange = (distance) =>
{
    let decimalRegEx = new RegExp(/^\d*\.?\d*$/)
    if (distance.length === 0 || distance === "." || distance[distance.length - 1] === "."
        && decimalRegEx.test(distance)
    ) {
        this.setState({ distance })
    } else {
        const distanceRegEx = new RegExp(/^\s*-?(\d+(\.\d{ 1, 2 })?|\.\d{ 1, 2 })\s*$/)
        if (distanceRegEx.test(distance)) this.setState({ distance })
    }
}

첫 번째 if블록은 사용자가 모든 텍스트를 삭제하거나 소수점을 첫 번째 문자로 사용하는 이벤트에 대한 오류 처리입니다. 또는 소수점 두 자리 이상을 입력하려고하면 두 번째 if블록은 다음과 같이 입력 할 수 있는지 확인합니다. 소수점 이하 소수점 이하 두 자리까지만 원하는만큼의 숫자.


2

RegExp를 사용하여 숫자가 아닌 것을 대체합니다. 다음 코드는 그가 찾은 첫 번째 숫자를 제공하므로 사용자가 둘 이상의 숫자 (xx.xx)가있는 단락을 붙여 넣으면 코드가 첫 번째 숫자를 제공합니다. 이것은 휴대폰이 아닌 가격과 같은 것을 원한다면 도움이 될 것입니다.

onTextChange 핸들러에 이것을 사용하십시오.

onChanged (text) {
    this.setState({
        number: text.replace(/[^(((\d)+(\.)\d)|((\d)+))]/g,'_').split("_"))[0],
    });
}

2

정규식을 사용하여 숫자가 아닌 문자를 제거 할 수 있습니다.

onTextChanged (text) {
    this.setState({
        myNumber: text.replace(/\D/g, ''),
    });
}

2
const [text, setText] = useState('');

const onChangeText = (text) => {
  if (+text) {
    setText(text);
  }
};

<TextInput
  keyboardType="numeric"
  value={text}
  onChangeText={onChangeText}
/>

실제 키보드에서 저장해야합니다.


1

이것은 IOS에서 작동하지 않으며 setState-> render-> 텍스트를 변경하지 않지만 다른 것을 변경할 수 있습니다. textinput은 textOnChange 때 자체 값을 변경할 수 없습니다.

그건 그렇고, 이것은 안드로이드에서 잘 작동합니다.


다른 사람들이 이해할 수 있도록 예제 코드로 설명하십시오.
— Bheru Lal Lohar 2007


1

정규 표현식을 사용하여 텍스트 상자에 숫자 만 허용하는 다른 간단한 대답은 다음과 같습니다.

onChanged(text){
    this.setState({ 
         myNumber: text.replace(/[^0-9]/g, '') 
    });
}

1

소수점 / 부동 소수점 번호의 경우에만 시도하십시오.

    onChangeMyFloatNumber(text){
let newText = '';
let numbers = '0123456789.';

for (var i=0; i < text.length; i++) {
    if(numbers.indexOf(text[i]) > -1 ) {
        newText = newText + text[i];
        if(text[i]=="."){
          numbers = '0123456789'
        }
    }
    else {
        // your call back function
        alert("please enter numbers only");
    }
}
this.setState({ MyFloatNumber: newText });

}


0

음, 이것은 0과 다른 숫자를 검증하는 아주 간단한 방법입니다.

if (+inputNum)

inputNum이 숫자가 아니면 NaN이되고 0이면 false가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.