Necesito tener un TextInput
componente React Native que solo permita ingresar caracteres numéricos (0 - 9). Puedo ajustar la keyboardType
a numeric
la que casi me lleva allí para la entrada a excepción del punto (.). Sin embargo, esto no hace nada para dejar de pegar caracteres no numéricos en el campo.
Lo que se me ocurrió hasta ahora es usar el OnChangeText
evento para ver el texto ingresado. Elimino los caracteres no numéricos del texto. Luego ponga el texto en un campo de estado. Luego actualice la propiedad a TextInput
través de ella Value
. Fragmento de código a continuación.
<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})
}
Esto parece funcionar, pero parece un truco. Hay otra manera de hacer esto?
react-native
Terry
fuente
fuente
keyboardType='numeric'
prop en TextInput para mostrar solo el teclado numérico (duh) y también reemplazando textos con expresiones regularestext.replace(/[^0-9]/g, '')
como se sugiere a continuación para evitar que alguien pegue cadenas dentro de TextInput. Está funcionando bien hasta ahora en React Native v0.62Respuestas:
Esa es la forma correcta de hacerlo hasta que tal componente (o atributo en TextInput) se desarrolle específicamente.
La web tiene el tipo 'número' para el elemento de entrada, pero eso está basado en web y react-native no usa una vista web.
Podría considerar crear esa entrada como un componente de reacción por sí solo (tal vez llamar a NumberInput): eso le permitirá reutilizarlo o tal vez incluso abrirlo como fuente, ya que puede crear muchos TextInputs que tienen diferentes filtros / verificadores de valor.
La desventaja de la corrección inmediata es garantizar que se brinde una retroalimentación correcta al usuario para evitar confusión sobre lo que sucedió con su valor.
fuente
Usar una expresión regular para reemplazar cualquier dígito que no sea es más rápido que usar un bucle for con una lista blanca, como lo hacen otras respuestas.
Use esto para su controlador onTextChange:
Prueba de rendimiento aquí: https://jsperf.com/removing-non-digit-characters-from-a-string
fuente
text.replace(/[^A-Za-z]/g, '')
keyboardType='numeric'
prop al campo TextInput.Puedes hacerlo así. Solo aceptará valores numéricos y se limitará a 10 números según lo desee.
Puede ver el valor ingresado escribiendo el siguiente código en su página:
En la función onChanged (), el código se ve así:
Espero que esto sea útil para otros.
fuente
React Native TextInput proporciona accesorios keyboardType con los siguientes valores posibles: teclado numérico predeterminado teclado decimal numérico dirección de correo electrónico teclado numérico
para su caso, puede usar keyboardType = 'number-pad' para aceptar solo números. Esto no incluye '.'
entonces,
es lo que tienes que usar en tu caso.
para obtener más detalles, consulte el enlace de documento oficial para TextInput: https://facebook.github.io/react-native/docs/textinput#keyboardtype
fuente
Función para validar la entrada:
Espero que esto sea útil.
fuente
Permitir solo números que utilicen una expresión regular
Es posible que desee tener más de una validación
fuente
validations(value: string) { return /0/.test(value) && /^\d+$/.test(value) ? this.setState({ numColumns: value }) : false; }
Primera solucion
Puede utilizar
keyboardType = 'numeric'
para teclado numérico.En el primer caso se incluyen signos de puntuación ej: - . y -
Segunda solución
Utilice expresiones regulares para eliminar los signos de puntuación.
Por favor, consulte el enlace de la merienda
https://snack.expo.io/@vishal7008/numeric-keyboard
fuente
Un amable recordatorio para aquellos que encontraron el problema de que "onChangeText" no puede cambiar el valor de TextInput como se esperaba en iOS: eso es en realidad un error en ReactNative y se ha corregido en la versión 0.57.1. Consulte: https://github.com/facebook/react-native/issues/18874
fuente
y método onChanged:
fuente
"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."
no sé qué hacer con esto. ¿Puede usted ayudar?Tuve el mismo problema en iOS, al usar el evento onChangeText para actualizar el valor del texto escrito por el usuario, no podía actualizar el valor de TextInput, por lo que el usuario aún vería los caracteres no numéricos que escribió.
Esto se debió a que, cuando se presionaba un carácter no numérico, el estado no cambiaba ya que this.setState estaría usando el mismo número (el número que quedaba después de eliminar los caracteres no numéricos) y luego el TextInput no volvería a renderizarse.
La única forma que encontré para resolver esto fue usar el evento keyPress que ocurre antes del evento onChangeText, y en él, usar setState para cambiar el valor del estado a otro, completamente diferente, forzando la re renderización cuando se llamó al evento onChangeText . No estoy muy contento con esto, pero funcionó.
fuente
fuente
Escribí esta función que encontré útil para evitar que el usuario pudiera ingresar algo más de lo que estaba dispuesto a aceptar. Yo también usé
keyboardType="decimal-pad"
y mionChangeText={this.decimalTextChange}
El primer
if
bloque es el manejo de errores para el evento en el que el usuario borra todo el texto, o usa un punto decimal como primer carácter, o si intenta poner más de un lugar decimal, el segundoif
bloque se asegura de que pueda escribir como tantos números como quieran antes del lugar decimal, pero solo hasta dos lugares decimales después del punto.fuente
Usar una expresión regular para reemplazar cualquier dígito que no sea. Tenga cuidado, el siguiente código le dará el primer dígito que encontró, por lo que si el usuario pega un párrafo con más de un número (xx.xx), el código le dará el primer número. Esto le ayudará si quiere algo como el precio, no un teléfono móvil.
Use esto para su controlador onTextChange:
fuente
Puede eliminar caracteres no numéricos usando expresiones regulares
fuente
Esto no funciona en IOS, setState -> render -> no cambia el texto, pero puede cambiar otro. La entrada de texto no puede cambiar su valor cuando textOnChange.
por cierto, esto funciona bien en Android.
fuente
Creé un componente que resuelve este problema:
https://github.com/amirfl/react-native-num-textinput
fuente
Aquí está mi otra respuesta simple para aceptar solo números en el cuadro de texto usando expresiones regulares.
fuente
Para el número de coma decimal / flotante, intente esto
}
fuente
Bueno, esta es una forma muy sencilla de validar un número diferente a 0.
Será NaN si inputNum no es un número o falso si es 0
fuente