Estoy tratando de escribir una aplicación que te ayude a administrar tus finanzas. Estoy usando un EditText
campo donde el usuario puede especificar una cantidad de dinero.
He establecido la inputType
a numberDecimal
la que funciona bien, excepto que esto permite que la gente entre en números como 123.122
que no es perfecto para el dinero.
¿Hay alguna forma de limitar el número de caracteres después del punto decimal a dos?
java
android
android-edittext
Konstantin Weitz
fuente
fuente
InputFilter
interfaz, parece hacer lo que quiero developer.android.com/reference/android/text/method/… , pero el métodofilter
que tengo que implementar es bastante confuso para mí. ¿Alguien ya escribió dicho filtro y sabe cómo usarlo?Respuestas:
Una forma más elegante sería usar una expresión regular (regex) de la siguiente manera:
Para usarlo haz:
fuente
Solución más simple sin usar expresiones regulares:
Usar:
fuente
Esta implementación de
InputFilter
resuelve el problema.fuente
Aquí hay una muestra de InputFilter que solo permite un máximo de 4 dígitos antes del punto decimal y un máximo de 1 dígito después de eso.
Valores que edittext permite: 555.2 , 555 , .2
Valores que editan bloques de texto: 55555.2 , 055.2 , 555.42
fuente
Hice algunas correcciones para la solución @Pinhassi. Maneja algunos casos:
1.puedes mover el cursor a cualquier parte
Manejo de signos 2.minus
3.digitsbefore = 2 y digitsafter = 4 e ingresa 12.4545. Entonces, si desea eliminar ".", No lo permitirá.
fuente
android:inputType="number"
oandroid:inputType="numberDecimal"
no permitirá escribir menos, estoandroid:digits="0123456789.-"
no ayudaNo me gusta la otra solución y creé la mía. Con esta solución, no puede ingresar más de MAX_BEFORE_POINT dígitos antes del punto y los decimales no pueden ser más de MAX_DECIMAL.
Simplemente no puede escribir el dígito en exceso, ¡no hay otros efectos! En adicional si escribe "." escribe "0"
Establezca EditText en el diseño para:
android: inputType = "numberDecimal"
Agregue el oyente en su onCreate. Si desea modificar el número de dígitos antes y después del punto, edite la llamada a PerfectDecimal (str, NUMBER_BEFORE_POINT, NUMBER_DECIMALS), aquí se establece en 3 y 2
Incluye esta función:
¡Y está hecho!
fuente
Lo logré con la ayuda de
TextWatcher
la siguiente maneraEsta solución no permitirá que el usuario ingrese más de dos dígitos después del punto decimal. También puede ingresar cualquier número de dígitos antes del punto decimal. Vea este blog http://v4all123.blogspot.com/2013/05/set-limit-for-fraction-in-decimal.html para establecer el filtro para múltiples EditText. Espero que esto sea de ayuda. Gracias.
fuente
count
con-1
. Entonces solo esto funcionará correctamente.int count = -1;
listener
. De cualquier manera por favor, eche un vistazo mi blog un mensaje . Puedes tener una idea. Si no puede, hágamelo saber. Te ayudaré con respecto a este tema.El InputFilter que se me ocurrió le permite configurar el número de dígitos antes y después del lugar decimal. Además, no permite los ceros a la izquierda.
fuente
El requisito es de 2 dígitos después del decimal. No debe haber límite para los dígitos antes del punto decimal. Entonces, la solución debería ser,
Y úsalo como,
Gracias a @Pinhassi por la inspiración.
fuente
¡Mi solución es simple y funciona perfecta!
Uso:
fuente
isValid()
constructor para evitar recrear patrones en cadaisValid()
llamada.Intente usar NumberFormat.getCurrencyInstance () para formatear su cadena antes de ponerla en TextView.
Algo como:
Editar : no hay inputType para la moneda que pude encontrar en los documentos. Me imagino que esto se debe a que hay algunas monedas que no siguen la misma regla para los decimales, como el yen japonés.
Como mencionó LeffelMania, puede corregir la entrada del usuario utilizando el código anterior con uno
TextWatcher
que está configurado en suEditText
.fuente
Solución ligeramente mejorada @Pinhassi.
Funciona muy bien Valida cadenas concatenadas.
fuente
Modifiqué las soluciones anteriores y creé la siguiente. Puede establecer el número de dígitos antes y después del punto decimal.
}
fuente
Lo que esto hace es que al salir de la fase de edición formatea el campo al formato correcto. En este momento solo tiene 2 caracteres decimales. Creo que esta es una manera bastante fácil de hacer esto.
fuente
Todas las respuestas aquí son bastante complejas. Intenté simplificarlo mucho. Mira mi código y decide por ti mismo:
fuente
Realmente me gustó la respuesta de Pinhassi, pero noté que después de que el usuario había ingresado los dígitos numéricos especificados después del punto decimal, ya no podía ingresar texto al lado izquierdo del punto decimal. El problema fue que la solución solo probó el texto anterior que se había ingresado, no el texto actual que se ingresó. Así que aquí está mi solución que inserta el nuevo personaje en el texto original para su validación.
Y la llamada para establecer el filtro editText
fuente
Mejoré la solución que usa una expresión regular de Pinhassi para que también maneje los casos de borde correctamente. Antes de verificar si la entrada es correcta, primero la cadena final se construye como lo describen los documentos de Android.
Uso:
fuente
La clase Simple Helper está aquí para evitar que el usuario ingrese más de 2 dígitos después del decimal:
fuente
He cambiado la respuesta №6 (por Favas Kv) porque allí puedes poner solo el punto en la primera posición.
fuente
Como dijeron otros, agregué esta clase en mi proyecto y configuré el filtro como
EditText
quiero.El filtro se copia de la respuesta de @ Pixel. Solo lo estoy poniendo todo junto.
Ahora configure el filtro en su
EditText
como este.Aquí, una cosa importante es que resuelve mi problema de no permitir mostrar más de dos dígitos después del punto decimal en eso,
EditText
pero el problema es que cuandogetText()
de esoEditText
, devuelve toda la entrada que escribí.Por ejemplo, después de aplicar el filtro sobre
EditText
, intenté configurar la entrada 1.5699856987. Entonces en la pantalla muestra 1.56, que es perfecto.Entonces quería usar esta entrada para algunos otros cálculos, así que quería obtener el texto de ese campo de entrada (
EditText
). Cuando lo llamémEditText.getText().toString()
devuelve 1.5699856987 que no era aceptable en mi caso.Así que tuve que analizar el valor nuevamente después de obtenerlo de
EditText
.setScale
hace el truco aquí después de obtener el texto completo deEditText
.fuente
También me he encontrado con este problema. Quería poder reutilizar el código en muchos EditTexts. Esta es mi solución:
Uso:
Clase:
fuente
@Meh para ti ...
fuente
Una respuesta muy tardía: podemos hacerlo simplemente así:
fuente
Aquí está el
TextWatcher
que permite solo n número de dígitos después del punto decimal.TextWatcher
Cómo utilizar
fuente
La forma más sencilla de lograr eso es:
fuente
Aquí está mi solución:
Si el usuario ingresa un número con más de dos números después del punto decimal, se corregirá automáticamente.
Espero haberte ayudado!
fuente
Esto funciona bien para mi. Permite ingresar el valor incluso después de cambiar el foco y recuperarlo. Por ejemplo:
123.00
,12.12
,0.01
, etc ..1.
Integer.parseInt(getString(R.string.valuelength))
Especifica la longitud de la entrada a la que sedigits.Values
accede desde elstring.xml
archivo. Es silencioso y fácil cambiar los valores. 2.Integer.parseInt(getString(R.string.valuedecimal))
, esto es para el límite máximo de decimales.Matriz de
EditText
valores que permite realizar acciones.Acabo de usar una matriz de valores que contienen múltiples
DecimalDigitsInputFilterNew.class
archivos de texto de edición Siguiente .fuente
Esto se basa en la respuesta de pinhassi: el problema que encontré fue que no se podían agregar valores antes del decimal una vez que se había alcanzado el límite decimal. Para solucionar el problema, necesitamos construir la cadena final antes de hacer la coincidencia del patrón.
fuente
fuente
source
despuéset.getText()
. Siempre entiende que las personas escriben al final del cuadro en lugar de comenzar el cuadro.StringBuilder stringBuilder = new StringBuilder(text.getText().toString()); stringBuilder.replace(dstart, dend, source.toString()); String temp = stringBuilder.toString();
Deberia trabajar. Gracias de cualquier manera.Cree una nueva clase en Android kotlin con el nombre DecimalDigitsInputFilter
Llama a esta clase con la siguiente línea
hay demasiadas respuestas para el mismo pero le permitirá ingresar 8 dígitos antes del decimal y 2 dígitos después del decimal
otras respuestas aceptan solo 8 dígitos
fuente