নেটিভ টেক্সটইনপুট প্রতিক্রিয়া জানান যা কেবলমাত্র সংখ্যার অক্ষর গ্রহণ করে


101

আমার একটি প্রতিক্রিয়া নেটিভ TextInputউপাদান থাকা দরকার যা কেবলমাত্র অক্ষর (0 - 9) প্রবেশ করানোর অনুমতি দেয়। পিরিয়ড (।) ব্যতীত প্রায় আমাকে ইনপুট দেওয়ার 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})
}

এটি কাজ করে মনে হচ্ছে তবে এটি হ্যাকের মতো মনে হচ্ছে। এই কাজ করার জন্য অন্য উপায় আছে কি?


কাজ করার জন্য এই উদাহরণটি কখনও পাইনি। আপনি কি অন্য কোনও উপায়ে এটি সমাধান করতে পেরেছেন?
এমবি


নোট করুন যে নেটিভ রেটিকাল 0.54 অনুসারে, এখানে প্রস্তাবিত বেশিরভাগ উত্তরগুলি নষ্ট হয়ে গেছে: github.com/facebook/react-native/issues/18874 (কমপক্ষে 0.56 পর্যন্ত, যা লেখার সময় নতুন সংস্করণ)।
টমটি 18

4
@ সুমিতকুমারপ্রধান সেই ব্লগ পোস্টে কীবোর্ডের টাইপটিকে 'সংখ্যাসূচক' হিসাবে সেট করার পরামর্শ দেয় যা আসলে পাঠ্য ইনপুটটিকে বাধা দেয় না। আপনি সেখানে যে কোনও কিছু আটকে দিতে চান তা অনুলিপি করতে পারেন।
জামাতেজে

আমি keyboardType='numeric'টেক্সটইনপুটে প্রোপ ব্যবহার করছি কেবলমাত্র নিউমারিকিক কীবোর্ড (দুহ) দেখানোর জন্য এবং টেক্সটইনপুটের text.replace(/[^0-9]/g, '')ভিতরে থাকা স্ট্রিংগুলি কাউকে আটকানো থেকে রোধ করার জন্য নীচের পরামর্শ অনুযায়ী পাঠ্যগুলি প্রতিস্থাপন করেছি। রিয়েট নেটিভ v0.62
কেশবদুলাল

উত্তর:


28

এ জাতীয় উপাদান (বা টেক্সটইনপুটটিতে বিশিষ্টতা) নির্দিষ্টভাবে বিকাশ না হওয়া পর্যন্ত এটি করার সঠিক উপায়।

ইনপুট উপাদানটির জন্য ওয়েবে 'নম্বর' টাইপ রয়েছে তবে এটি ওয়েব ভিত্তিক এবং প্রতিক্রিয়া-স্থানীয় কোনও ওয়েব ভিউ ব্যবহার করে না।

আপনি সেই ইনপুটটিকে তার নিজস্ব প্রতিক্রিয়ার উপাদান হিসাবে তৈরি করতে বিবেচনা করতে পারেন (সম্ভবত কল করুন নাম্বার ইনপুট): এটি আপনাকে এটি পুনরায় ব্যবহার করতে সক্ষম করতে সক্ষম হতে পারে বা এমনকি ওপেন সোর্সও এহেতু আপনি অনেকগুলি টেক্সটইনপুট তৈরি করতে পারেন যার বিভিন্ন মান ফিল্টার / চেকার রয়েছে।

তাত্ক্ষণিক সংশোধনের নেতিবাচকতা হ'ল ব্যবহারকারীকে তার মূল্যের কী হয়েছে তা নিয়ে বিভ্রান্তি রোধ করার জন্য সঠিক প্রতিক্রিয়া দেওয়া নিশ্চিত করা


আমি কীভাবে দেশের কোডটি সেট করতে পারি ((যেমন) আমি পাঠ্য ইনপুট উপাদানগুলির যে
কোনও প্রপস

101

অন্য উত্তরগুলির মতো কোনও হাইটলিস্টের সাথে লুপের জন্য ব্যবহারের চেয়ে কোনও অ-অঙ্কের প্রতিস্থাপনের জন্য একটি রেজিএক্সপ্যাক ব্যবহার করা দ্রুত।

আপনার অনটেক্সট চেঞ্জ হ্যান্ডলারের জন্য এটি ব্যবহার করুন:

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

পারফরম্যান্স পরীক্ষা এখানে: https://jsperf.com/removing-non-digit-characters-from-a-string


এই পদ্ধতিটি ব্যবহার করে আমি কীভাবে কেবল ইংরেজী বর্ণমালার অক্ষরে অনুমতি দিতে পারি?
CraZyDroiD

4
@ ক্রাজিড্রয়েড কেবলমাত্র রেজেক্স সামঞ্জস্য করুন। আপনি যদি কেবল এজেডের সাথে মেলে রাখতে চান তবে আপনার এমন কিছু লাগবেtext.replace(/[^A-Za-z]/g, '')
জেক টেলর

4
keyboardType='numeric'টেক্সটইনপুট ক্ষেত্রে প্রপও পাস করুন ।
কেশবদুলাল

91

আপনি এটি এইভাবে করতে পারেন। এটি কেবলমাত্র সংখ্যার মানগুলি গ্রহণ করবে এবং আপনার ইচ্ছার হিসাবে 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(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 (পাঠ্য) {var newText = ''; var সংখ্যা = '0123456789'; যদি (পাঠ্য দৈর্ঘ্য <1) {this.setState ({myNumber: ''}); var এর জন্য (var i = 0; i <text.length; i++) {যদি (number.indexOf (পাঠ্য [i])> -1) {newText = নতুন পাঠ্য + পাঠ [i]; } this.setState ({myNumber: newText}); }}
ভেরু লাল লোহার

4
ভাল উত্তর, তবে কেন আপনি '9' নম্বরটি ঘৃণা করেন
স্ট্যানলি লুও

19
কারণ 7 ঘৃণা 9?
নৌকা কোডার

4
ঝাঁকুনি ঠেকাতে কোনও উপায় আছে কি?
ওয়ালটারি

আপনি সেরা
ফেল্লাস

17

নেটিভ টেক্সটইনপুট প্রতিক্রিয়া নিম্নলিখিত নিম্নলিখিত মান সহ কীবোর্ড টাইপ প্রপস প্রদান করে: ডিফল্ট নম্বর-প্যাড দশমিক-প্যাড সংখ্যাসূচক ইমেল ঠিকানা ফোন-প্যাড

সুতরাং আপনার ক্ষেত্রে আপনি কেবল সংখ্যা গ্রহণের জন্য কীবোর্ড টাইপ = 'সংখ্যা-প্যাড' ব্যবহার করতে পারেন। এর মধ্যে 'অন্তর্ভুক্ত নয়'।

সুতরাং,

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

আপনার ক্ষেত্রে আপনার যা ব্যবহার করতে হবে তা হল।

আরও তথ্যের জন্য দয়া করে পাঠ্য ইনপুট জন্য অফিসিয়াল ডক লিঙ্ক দেখুন: 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')}
/>

আমি আশা করি এই সহায়ক।


এটি আরও কার্যকর উপায়, লুপিং পদ্ধতির পরিবর্তে এটি অনুসরণ করা উচিত
আসিফ আলী

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; }
ফ্রেডেরিকো সিজার


9

প্রথম সমাধান

আপনি 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

যারা এই সমস্যার মুখোমুখি হয়েছিলেন তাদের জন্য একটি দয়া করে স্মরণ করিয়ে দেওয়া যে "অন চেঞ্জটেক্সট" আইওএস-তে প্রত্যাশা অনুযায়ী টেক্সটইনপুট মানটি পরিবর্তন করতে পারে না: এটি আসলে রিঅ্যাকটিভেটে একটি বাগ এবং সংস্করণ 0.57.1-এ স্থির করা হয়েছিল। এখানে দেখুন: https://github.com/facebook/react-native/issues/18874


এটি একটি মন্তব্য হওয়া উচিত এবং উত্তর নয়
হারিস নাদিম

4
ক্ষমা প্রার্থনা করুন যে প্রশ্নটিতে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই তাই আমি একটি উত্তর দিয়ে শেষ করে আশা করি যে কার্যক্ষম সমাধানগুলি সন্ধানকারী লোকদের দিকে দৃষ্টি আকর্ষণ করব।
উইং

ন্যায্য বিন্দু. আমি দেখেছি যে মন্তব্য করতে একজনের 50 টি খ্যাতি লাগবে। দুঃখের বিষয়, আমি এই বিধিনিষেধটি সরাতে পারি না, তবে আমি আপনাকে 10 খ্যাতি দিতে পারি এবং আশা করি কিছুটা বিধিনিষেধ অপসারণ করতে পারি।
হারিস নাদিম

মন্তব্য বিধান পেতে এটি আরও 10 নিন ... চিয়ার্স @ উইং
ভেঙ্কটেশ সোমু '

ধন্যবাদ :) @ ভেনকাটেশ সোমু
উইং

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."আমি কী করতে পারি তা জানিনা। তুমি কি সাহায্য করতে পারো?
মাইক 15

@ মাইকের কোনও ইভেন্টের কারণ হতে পারে, আপনি কী আপনার উপাদান কোডটি জেএসফিডাল বা rnplay.org- এর মাধ্যমে ভাগ করতে পারবেন
ভেরু লাল লোহার

আমি এখানে মন্তব্য করার খুব শীঘ্রই এটি সমাধান করেছি, তবে দুর্ভাগ্যক্রমে সমস্যাটি কী তা বুঝতে পেরেছি।
মাইক 14

একটি রেজেক্স ব্যবহার করা একটি দুর্দান্ত পছন্দ হবে
আসিফ আলি

4

আইওএস-এ আমার একই সমস্যা ছিল, ব্যবহারকারীর দ্বারা টাইপ করা পাঠ্যের মান আপডেট করার জন্য onChangeText ইভেন্টটি ব্যবহার করে আমি টেক্সটইনপুটটির মান আপডেট করতে সক্ষম হচ্ছিলাম না, তাই ব্যবহারকারী তারপরে যে সংখ্যাটি লিখেছেন তা এখনও দেখতে পাবে।

এটি কারণ ছিল, যখন একটি অ-সংখ্যাযুক্ত চরিত্রটি চাপ দেওয়া হয় তখন রাষ্ট্র পরিবর্তন হবে না কারণ সেটটি স্টেট একই সংখ্যাটি ব্যবহার করবে (সংখ্যাটি অ-অক্ষরগুলি সরিয়ে দেওয়ার পরেও রয়ে গেছে) এবং তারপরে টেক্সটইনপুট রেন্ডার করবে না।

এটির সমাধানের একমাত্র উপায় হ'ল onChangeText ইভেন্টের আগে ঘটে যাওয়া কীপ্রেস ইভেন্টটি ব্যবহার করা এবং এটিতে, স্টেটের স্টেট ব্যবহার করে রাষ্ট্রের মান অন্যটিতে পরিবর্তিত করা, সম্পূর্ণ আলাদা, অন-চেঞ্জটেক্সট ইভেন্টটি ডাকা হলে পুনরায় রেন্ডার করতে বাধ্য করা হয় re । এটি দিয়ে খুব খুশি নয় তবে এটি কাজ করেছিল।


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

! / ^ [0-9] + $ /। পরীক্ষা ('123456askm') এটি ইনপুট স্ট্রিংটি সাংখ্যিক কিনা তা পরীক্ষা করবে। আপনার মান)
আনকিট-ডিট্রোজা

4
হাই, দয়া করে আপনার উত্তরটি প্রসারিত করুন কেন এটি ওপি-র সমস্যার সমাধান হতে পারে be এটি ওপি এবং সাইটের ভবিষ্যতের দর্শকদের সহায়তা করবে। ধন্যবাদ!
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ব্লক নিশ্চিত করে যে তারা টাইপ করতে পারে দশমিক স্থানের আগে যতগুলি সংখ্যা তারা চান তবে পয়েন্টের পরে কেবলমাত্র দুটি দশমিক স্থান পর্যন্ত places


2

কোনও অ ডিজিট প্রতিস্থাপন করতে একটি RegExp ব্যবহার করা। খেয়াল রাখুন পরবর্তী কোডটি আপনাকে তার প্রথম অঙ্কটি খুঁজে পেয়েছে, সুতরাং ব্যবহারকারী যদি একাধিক সংখ্যার (xx.xx) অনুচ্ছেদে পেস্ট করে তবে কোডটি আপনাকে প্রথম নম্বর দেবে। আপনি মোবাইল ফোন নয়, দামের মতো কিছু চাইলে এটি সহায়তা করবে।

আপনার অনটেক্সট চেঞ্জ হ্যান্ডলারের জন্য এটি ব্যবহার করুন:

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

2

আপনি রেজেক্স ব্যবহার করে সংখ্যাসূচক অক্ষর মুছে ফেলতে পারেন

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

1

এটি আইওএসে কাজ করে না, সেটস্টেট -> রেন্ডার করুন -> পাঠ্য পরিবর্তন না করে, তবে অন্যটি পরিবর্তন করতে পারে। পাঠ্যপরিচালনা যখন পাঠ্য অনচেন্জ হয় তখন নিজের মানটি পরিবর্তন করতে পারে না।

যাইহোক, এটি অ্যান্ড্রয়েডে ভাল কাজ করে।


উদাহরণ কোড সহ ব্যাখ্যা করুন যাতে অন্য বুঝতে পারে।
ভেড়ু লাল লোহার


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)

যদি ইনপুটনামটি সংখ্যা না হয় বা এটি 0 হয় তবে এটি NaN হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.