Estou tentando escrever um aplicativo que ajude você a gerenciar suas finanças. Estou usando um EditText
campo em que o usuário pode especificar uma quantia em dinheiro.
Eu defini o inputType
de numberDecimal
que funciona bem, exceto que este permite que as pessoas para digitar números, como 123.122
o que não é perfeito para o dinheiro.
Existe uma maneira de limitar o número de caracteres após o ponto decimal para dois?
java
android
android-edittext
Konstantin Weitz
fonte
fonte
InputFilter
interface, parece fazer o que eu quero developer.android.com/reference/android/text/method/… , mas o métodofilter
que tenho que implementar é bastante confuso para mim. Alguém já escreveu esse filtro e sabe como usá-lo?Respostas:
A maneira mais elegante seria usar uma expressão regular (regex) da seguinte maneira:
Para usá-lo, faça:
fonte
Solução mais simples sem usar o regex:
Usar:
fonte
Esta implementação de
InputFilter
resolve o problema.fonte
Aqui está um exemplo de InputFilter que permite apenas no máximo 4 dígitos antes do ponto decimal e no máximo 1 dígito depois disso.
Valores que EditText permite: 555,2 , 555 , .2
Valores que o edittext bloqueia: 55555.2 , 055.2 , 555.42
fonte
Fiz algumas correções para a solução @Pinhassi. Ele lida com alguns casos:
1. você pode mover o cursor para qualquer lugar
2.usus manipulação de sinal
3.digitsbefore = 2 e digitsafter = 4 e você insere 12.4545. Então, se você deseja remover ".", Não será permitido.
fonte
android:inputType="number"
ouandroid:inputType="numberDecimal"
não permitirá que digitar menos, issoandroid:digits="0123456789.-"
não ajudaNão gosto da outra solução e criei a minha. Com esta solução, você não pode inserir mais de MAX_BEFORE_POINT dígito antes do ponto e os decimais não podem ser maiores que MAX_DECIMAL.
Você simplesmente não pode digitar o dígito em excesso, sem outros efeitos! Além disso, se você escrever "." digita "0"
Defina o EditText no layout para:
android: inputType = "numberDecimal"
Adicione o Ouvinte ao seu onCreate. Se você deseja modificar o número de dígitos antes e depois do ponto, edite a chamada para PerfectDecimal (str, NUMBER_BEFORE_POINT, NUMBER_DECIMALS), e defina aqui 3 e 2
Inclua este Funcion:
E está feito!
fonte
Consegui isso com a ajuda da
TextWatcher
seguinte maneiraEsta solução não permitirá que o usuário insira mais de dois dígitos após o ponto decimal. Além disso, você pode inserir qualquer número de dígitos antes do ponto decimal. Consulte este blog http://v4all123.blogspot.com/2013/05/set-limit-for-fraction-in-decimal.html para definir o filtro para vários EditText. Espero que isso ajude. Obrigado.
fonte
count
com-1
. Então, somente isso funcionará corretamente.int count = -1;
listener
. De qualquer forma, por favor dê uma olhada uma meu blog pós . Você pode ter uma ideia. Se você não puder, por favor me avise. Ajudarei você a resolver esse problema.O InputFilter que eu criei permite que você configure o número de dígitos antes e depois da casa decimal. Além disso, ele não permite zeros à esquerda.
fonte
O requisito é de 2 dígitos após o decimal. Não deve haver limite para dígitos antes do ponto decimal. Então, a solução deve ser,
E use-o como,
Obrigado a @Pinhassi pela inspiração.
fonte
Minha solução é simples e funciona perfeita!
Uso:
fonte
isValid()
para o construtor para evitar a recriação de padrões em cadaisValid()
chamada.Tente usar NumberFormat.getCurrencyInstance () para formatar sua sequência antes de colocá-la em um TextView.
Algo como:
Editar - não há inputType para a moeda que eu possa encontrar nos documentos. Imagino que isso ocorra porque existem algumas moedas que não seguem a mesma regra para casas decimais, como o iene japonês.
Como o LeffelMania mencionou, você pode corrigir a entrada do usuário usando o código acima com um código
TextWatcher
definido no seuEditText
.fonte
Solução @Pinhassi ligeiramente melhorada.
Funciona muito bem. Ele valida seqüências de caracteres concatenadas.
fonte
Modifiquei as soluções acima e criei a seguir. Você pode definir o número de dígitos antes e depois do ponto decimal.
}
fonte
O que isso faz é que, quando você sai da fase de edição, ele formata o campo no formato correto. No momento, eles têm apenas 2 caracteres decimais. Eu acho que essa é uma maneira bem fácil de fazer isso.
fonte
Todas as respostas aqui são bastante complexas, tentei simplificá-lo.Veja o meu código e decida por si mesmo -
fonte
Gostei muito da resposta de Pinhassi, mas notei que após o usuário digitar os dígitos do número especificado após o ponto decimal, você não podia mais inserir texto no lado esquerdo do ponto decimal. O problema era que a solução testou apenas o texto anterior que havia sido inserido, e não o texto atual sendo inserido. Então, aqui está minha solução que insere o novo caractere no texto original para validação.
E a chamada para definir o filtro editText
fonte
Aprimorei a solução que usa um regex de Pinhassi para que ele também lide com os casos de borda corretamente. Antes de verificar se a entrada está correta, primeiro a sequência final é construída conforme descrito pelos documentos do Android.
Uso:
fonte
A classe Simple Helper está aqui para impedir que o usuário digite mais de 2 dígitos após o decimal:
fonte
Eu mudei a resposta №6 (por Favas Kv) porque lá Você pode colocar apenas um ponto na primeira posição.
fonte
Como outros disseram, eu adicionei essa classe no meu projeto e configurei o filtro para o que
EditText
eu quero.O filtro é copiado da resposta do @ Pixel. Estou apenas juntando tudo.
Agora defina o filtro
EditText
como você está.Aqui, uma coisa importante é que resolve meu problema de não permitir mostrar mais de dois dígitos após o ponto decimal,
EditText
mas o problema égetText()
queEditText
, a partir daí, ele retorna toda a entrada digitada.Por exemplo, depois de aplicar o filtro sobre o
EditText
, tentei definir a entrada 1.5699856987. Então, na tela, mostra 1,56, o que é perfeito.Então, eu queria usar essa entrada para alguns outros cálculos, então queria obter o texto desse campo de entrada (
EditText
). Quando eu chameimEditText.getText().toString()
, retorna 1.5699856987, o que não era aceitável no meu caso.Então eu tive que analisar o valor novamente depois de obtê-lo do
EditText
.setScale
faz o truque aqui depois de obter o texto completo doEditText
.fonte
Eu também me deparei com este problema. Eu queria poder reutilizar o código em muitos EditTexts. Esta é a minha solução:
Uso:
Classe:
fonte
@Meh for u ..
fonte
Uma resposta muito tardia: podemos fazê-lo simplesmente assim:
fonte
Aqui está o
TextWatcher
que permite apenas n número de dígitos após o ponto decimal.TextWatcher
Como usar
fonte
A maneira mais simples de conseguir isso é:
fonte
Aqui está a minha solução:
Se o usuário digitar um número com mais de dois números após o ponto decimal, ele será corrigido automaticamente.
Espero ter ajudado!
fonte
Este trabalho é bom para mim. Permite que o valor seja inserido mesmo depois que o foco foi alterado e recuperado novamente. Por exemplo:
123.00
,12.12
,0.01
, etc ..1.
Integer.parseInt(getString(R.string.valuelength))
Especifica o comprimento da entradadigits.Values
acessada a partir dostring.xml
arquivo. É muito fácil alterar valores. 2.Integer.parseInt(getString(R.string.valuedecimal))
, isto é para o limite máximo de casas decimais.Matriz de
EditText
valores que permite executar a ação.Acabei de usar uma matriz de valores que contêm vários arquivos seguintes do edittext
DecimalDigitsInputFilterNew.class
.fonte
Isso é baseado na resposta de pinhassi - a questão que me deparei foi que você não podia adicionar valores antes do decimal uma vez que o limite decimal fosse atingido. Para corrigir o problema, precisamos construir a sequência final antes de fazer a correspondência de padrões.
fonte
fonte
source
depoiset.getText()
. Ele sempre entende que as pessoas digitam no final da caixa em vez de começar a caixa.StringBuilder stringBuilder = new StringBuilder(text.getText().toString()); stringBuilder.replace(dstart, dend, source.toString()); String temp = stringBuilder.toString();
Deveria trabalhar. Obrigado mesmo assim.Crie uma nova classe no Android kotlin com o nome DecimalDigitsInputFilter
Chame essa classe com a seguinte linha
existem muitas respostas para o mesmo, mas isso permitirá que você digite 8 dígitos antes do decimal e 2 dígitos após o decimal
outras respostas estão aceitando apenas 8 dígitos
fonte