Preciso ter um TextInput
componente React Native que só permitirá a inserção de caracteres numéricos (0 - 9). Posso definir o keyboardType
para o numeric
qual quase me leva lá para entrada, exceto para o ponto (.). No entanto, isso não impede a colagem de caracteres não numéricos no campo.
O que descobri até agora é usar o OnChangeText
evento para ver o texto inserido. Eu removo todos os caracteres não numéricos do texto. Em seguida, coloque o texto em um campo de estado. Em seguida, atualize o TextInput
por meio de sua Value
propriedade. Snippet de código abaixo.
<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})
}
Isso parece funcionar, mas parece um hack. Há outra maneira de fazer isso?
react-native
Terry
fonte
fonte
keyboardType='numeric'
prop em TextInput para mostrar apenas teclado numérico (duh) e também substituindo textos por regextext.replace(/[^0-9]/g, '')
como sugerido abaixo para evitar que alguém cole strings dentro de TextInput. Está funcionando bem até agora no React Native v0.62Respostas:
Essa é a maneira correta de fazer isso até que tal componente (ou atributo no TextInput) seja especificamente desenvolvido.
A web tem o tipo 'número' para o elemento de entrada, mas é baseado na web e o react-native não usa uma visualização da web.
Você pode considerar a criação dessa entrada como um componente de reação por conta própria (talvez chame NumberInput): isso permitirá que você a reutilize ou talvez até mesmo abra o código-fonte, pois você pode criar muitas TextInputs com diferentes filtros / verificadores de valor.
A desvantagem da correção imediata é garantir que o feedback correto seja dado ao usuário para evitar confusão quanto ao que aconteceu com seu valor
fonte
Usar um RegExp para substituir qualquer não dígito é mais rápido do que usar um loop for com uma lista de permissões, como fazem outras respostas.
Use para o seu gerenciador onTextChange:
Teste de desempenho aqui: https://jsperf.com/removing-non-digit-characters-from-a-string
fonte
text.replace(/[^A-Za-z]/g, '')
keyboardType='numeric'
prop para o campo TextInput.Você pode fazer assim. Ele só aceitará valores numéricos e terá um limite de 10 números conforme sua preferência.
Você pode ver o valor inserido escrevendo o seguinte código em sua página:
Na função onChanged (), o código se parece com este:
Espero que isso seja útil para outros.
fonte
React Native TextInput fornece adereços keyboardType com os seguintes valores possíveis: teclado numérico padrão teclado decimal numérico endereço de e-mail teclado numérico
então, para o seu caso, você pode usar keyboardType = 'number-pad' para aceitar apenas números. Isso não inclui '.'
então,
é o que você deve usar no seu caso.
para obter mais detalhes, consulte o link do documento oficial para TextInput: https://facebook.github.io/react-native/docs/textinput#keyboardtype
fonte
Função para validar a entrada:
Espero que isto seja útil.
fonte
Permitir apenas números usando uma expressão regular
Você pode querer ter mais de uma validação
fonte
validations(value: string) { return /0/.test(value) && /^\d+$/.test(value) ? this.setState({ numColumns: value }) : false; }
Primeira Solução
Você pode usar
keyboardType = 'numeric'
para teclado numérico.No primeiro caso, são incluídos sinais de pontuação, por exemplo: - . e -
Segunda Solução
Use expressões regulares para remover sinais de pontuação.
Por favor, verifique o link do lanche
https://snack.expo.io/@vishal7008/numeric-keyboard
fonte
Um lembrete gentil para aqueles que encontraram o problema de que "onChangeText" não pode alterar o valor TextInput como esperado no iOS: isso é na verdade um bug no ReactNative e foi corrigido na versão 0.57.1. Consulte: https://github.com/facebook/react-native/issues/18874
fonte
e método onChanged:
fonte
"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."
não sei o que fazer com isso. Você pode ajudar?Tive o mesmo problema no iOS, usando o evento onChangeText para atualizar o valor do texto digitado pelo usuário, não estava conseguindo atualizar o valor do TextInput, então o usuário ainda veria os caracteres não numéricos que digitou.
Isso ocorria porque, quando um caractere não numérico fosse pressionado, o estado não mudaria, pois this.setState estaria usando o mesmo número (o número que permanecia após a remoção dos caracteres não numéricos) e então TextInput não seria renderizado novamente.
A única maneira que encontrei de resolver isso foi usar o evento keyPress que acontece antes do evento onChangeText, e nele, usar setState para alterar o valor do estado para outro, completamente diferente, forçando a renderização novamente quando o evento onChangeText foi chamado . Não muito feliz com isso, mas funcionou.
fonte
fonte
Eu escrevi esta função que achei útil para evitar que o usuário seja capaz de inserir qualquer coisa diferente da que eu estava disposto a aceitar. Eu também usei
keyboardType="decimal-pad"
e meuonChangeText={this.decimalTextChange}
O primeiro
if
bloco é o tratamento de erros para o evento em que o usuário exclui todo o texto, ou usa um ponto decimal como o primeiro caractere, ou se tentar colocar mais de uma casa decimal, o segundoif
bloco garante que eles podem digitar como muitos números que quiserem antes da casa decimal, mas apenas até duas casas decimais depois da vírgula.fonte
Usando um RegExp para substituir qualquer não dígito. Tome cuidado para que o próximo código forneça o primeiro dígito que ele encontrou, portanto, se o usuário colar um parágrafo com mais de um número (xx.xx), o código fornecerá o primeiro número. Isso ajudará se você quiser algo como preço, não um telefone celular.
Use para o seu gerenciador onTextChange:
fonte
Você pode remover caracteres não numéricos usando regex
fonte
const [text, setText] = useState(''); const onChangeText = (text) => { if (+text) { setText(text); } }; <TextInput keyboardType="numeric" value={text} onChangeText={onChangeText} />
Isso deve salvar de teclados físicos
fonte
Isso não funciona no IOS, setState -> render -> não altera o texto, mas pode alterar outro. O textinput não pode alterar seu próprio valor quando textOnChange.
A propósito, isso funciona bem no Android.
fonte
Criei um componente que resolve esse problema:
https://github.com/amirfl/react-native-num-textinput
fonte
Aqui está minha outra resposta simples para aceitar apenas números na caixa de texto usando expressões regulares.
fonte
Para números decimais / flutuantes, tente isso
}
fonte
Bem, esta é uma maneira muito simples de validar um número diferente de 0.
Será NaN se inputNum não for um número ou falso se for 0
fonte