我需要一个React Native 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 :(得分:63)
你可以这样做。它只接受数字值,并根据您的意愿限制为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 });
}
我希望这对其他人有帮助。
答案 1 :(得分:55)
使用RegExp替换任何非数字比使用白名单的for循环更快,就像其他答案一样。
将此用于onTextChange处理程序:
onChanged (text) {
this.setState({
mobile: text.replace(/[^0-9]/g, ''),
});
}
此处的效果测试:https://jsperf.com/removing-non-digit-characters-from-a-string
答案 2 :(得分:15)
这是正确的方法,直到专门开发出这样的组件(或TextInput上的属性)。
网络具有输入元素的“数字”类型,但这是基于网络的,而本地反应则不使用网络视图。
您可以考虑将该输入创建为自己的反应组件(可能调用NumberInput):这将使您能够重用它或者甚至可以开源它,因为您可以创建许多具有不同值过滤器/检查器的TextInputs
立即纠正的缺点是确保向用户提供正确的反馈,以防止混淆他的价值发生了什么
答案 3 :(得分:4)
React Native TextInput为keyboardType道具提供以下可能的值: 默认 数字键盘 小数点 数字 电子邮件地址 手机键盘
因此对于您的情况,您可以使用keyboardType ='数字键盘'仅接受数字。这不包括'。'
所以
<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
答案 4 :(得分:4)
验证输入的功能:
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')}
/>
我希望这会有所帮助。
答案 5 :(得分:3)
<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 });
}
}
答案 6 :(得分:2)
我在iOS中遇到同样的问题,使用onChangeText事件来更新用户输入的文本的值我无法更新TextInput的值,因此用户仍会看到非数字字符他打字。
这是因为,当按下非数字字符时,状态不会改变,因为this.setState将使用相同的数字(删除非数字字符后剩余的数字),然后TextInput将不会重新呈现。
我发现解决这个问题的唯一方法是使用在onChangeText事件之前发生的keyPress事件,并在其中使用setState将状态值更改为另一个,完全不同,强制在onChangeText时重新呈现事件被称为。对此不太满意,但它确实有效。
答案 7 :(得分:2)
const [text, setText] = useState('');
const onChangeText = (text) => {
if (+text) {
setText(text);
}
};
<TextInput
keyboardType="numeric"
value={text}
onChangeText={onChangeText}
/>
这应该从物理键盘保存
答案 8 :(得分:2)
<TextInput
keyboardType = 'numeric'
onChangeText = {(e)=> this.onTextChanged(e)}
value = {this.state.myNumber}
/>
onTextChanged(e) {
if (/^\d+$/.test(e.toString())) {
this.setState({ myNumber: e });
}
}
答案 9 :(得分:2)
谨此提醒那些遇到以下问题的人:“ onChangeText”无法按iOS预期的那样更改TextInput值:这实际上是ReactNative中的一个错误,已在0.57.1版中修复。请参阅:https://github.com/facebook/react-native/issues/18874
答案 10 :(得分:1)
使用RegExp替换任何非数字。注意下一个代码会给你找到的第一个数字,所以如果用户粘贴一个带有多个数字(xx.xx)的段落,代码会给你第一个数字。如果你想要价格而不是手机,这将有所帮助。
将此用于onTextChange处理程序:
onChanged (text) {
this.setState({
number: text.replace(/[^(((\d)+(\.)\d)|((\d)+))]/g,'_').split("_"))[0],
});
}
答案 11 :(得分:1)
我编写了此功能,发现该功能有助于防止用户输入除我愿意接受之外的任何内容。我还使用了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
块可确保他们可以在小数点前输入任意数量的数字,但只能在小数点后输入两个小数位。
答案 12 :(得分:1)
if (!/^[0-9]+$/.test('123456askm')) {
consol.log('Enter Only Number');
} else {
consol.log('Sucess');
}
答案 13 :(得分:0)
怎么样
onChangeText={(val) => {
if(!isNaN(val)){
//setValue()
}
}
keyboardType="numeric"
这将检查数字是否不是数字,然后才设置文本。
答案 14 :(得分:0)
嗯,这是一种非常简单的方法来验证不同于0的数字。
if (+inputNum)
如果inputNum不是数字,则为NaN;如果为0,则为false
答案 15 :(得分:0)
将您的键盘类型更改为数字
<TextInput
onChangeText={this.onChangeText}
keyboardType={"numeric"}
/>
然后用空格替换点
onChangeText=(value)=>{
let text = value.replace(".", '');
if (isNaN(text)) {
// Its not a number
return
}
console.log("text",text)
}
答案 16 :(得分:0)
我认为,
onChangeText((val:string) =>
isNaN(Number(val))
? val.substr(0, val.length - 1)
: val
)
// 0 > true
// 0. > true
// 0.3 > true
// - > false
// . > false
// 0.4- > false
// -1.3 > true
此代码将检查“这不是数字吗?”并且,如果最后一个字符错误,则删除最后一个字。
答案 17 :(得分:0)
第一个解决方案
您可以将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, '') });
}
请检查小吃链接
答案 18 :(得分:0)
仅对十进制/浮点数尝试
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 });
}
答案 19 :(得分:0)
这是我的另一个简单答案,即使用正则表达式仅接受文本框中的数字。
onChanged(text){
this.setState({
myNumber: text.replace(/[^0-9]/g, '')
});
}
答案 20 :(得分:0)
您可以使用正则表达式删除非数字字符
onTextChanged (text) {
this.setState({
myNumber: text.replace(/\D/g, ''),
});
}
答案 21 :(得分:0)
我创建了一个解决此问题的组件:
答案 22 :(得分:0)
这不适用于IOS,setState - &gt;渲染 - &gt;不改变文字,但可以改变其他文字。 当textOnChange时,textinput不能改变自身的值。
顺便说一句,这在Android上运行良好。