Pregunta

Estoy tratando de crear una expresión regular para mi aplicación Android para que la moneda esté formateada como en la respuesta superior a esta pregunta:

public void onTextChanged(CharSequence s, int start,

        int before, int count) {
    if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
    {
        String userInput= ""+s.toString().replaceAll("[^\\d]", "");
        StringBuilder cashAmountBuilder = new StringBuilder(userInput);

        while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
            cashAmountBuilder.deleteCharAt(0);
        }
        while (cashAmountBuilder.length() < 3) {
            cashAmountBuilder.insert(0, '0');
        }
        cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.');
        cashAmountBuilder.insert(0, '$');

        cashAmountEdit.setText(cashAmountBuilder.toString());
    }

}

Entrada de dinero de Android con decimal fijo

Quiero poder tener el mismo formato que ese ejemplo logra simplemente menos el símbolo del dólar antes de los números, pero realmente no estoy seguro de cómo alterar ese código para lograrlo, ¿o hay una forma alternativa?

Editar: Después de más comentarios, es evidente para mí, podría no ser esta parte en particular de mi código. Puedo hacer que esto funcione usando un entrenamiento muy tonto cambiando el signo del dólar para un espacio en blanco en la expresión regular y ingresando un espacio en blanco antes de los números, recortándolo más tarde cuando necesito el valor, pero no puedo encontrar un mejor solución alterna.

private TextWatcher billWatcher = new TextWatcher() {
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
        {
            String userInput= ""+s.toString().replaceAll("[^\\d]", "");
            StringBuilder cashAmountBuilder = new StringBuilder(userInput);

            while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
                cashAmountBuilder.deleteCharAt(0);
            }
            while (cashAmountBuilder.length() < 3) {
                cashAmountBuilder.insert(0, '0');
            }
            cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.');
            cashAmountBuilder.insert(0, '$');     

            billBox.setText(cashAmountBuilder.toString());
            billBox.setTextKeepState(cashAmountBuilder.toString());
            Selection.setSelection(billBox.getText(), cashAmountBuilder.toString().length());
        }
    }

XML para la caja

 <EditText
        android:id="@+id/billBox"
        android:layout_width="152dp"
        android:layout_height="40dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/billText"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:digits="0123456789."
        android:gravity="right"
        android:inputType="numberDecimal" />
¿Fue útil?

Solución

Tú tienes: <EditText ... android:digits="0123456789." ... />

Y sin embargo, tu expresión regular tiene \\$(\\d{1,3}.... Lo que se traduce en "signo de dólar seguido de más dígitos".

Creo que el sistema está confundido de que está exigiendo que esté presente un signo de dólar, pero que lo prohíba en su XML.

Sacaría la primera parte de su expresión regular y pondría el inicio de sesión en dólar para el usuario.

Otros consejos

Eliminar esta línea

cashAmountBuilder.insert(0, '$');

Todo lo que necesita hacer para sacar el símbolo del dólar es eliminar esta línea: CashamountBuilder.insert (0, '$');.

Creo que estás tratando de hacer demasiado que el sistema ya puede hacer por ti. Si mantiene el valor de la moneda como doble internamente y solo lo formatea cuando desea mostrarlo, es mucho más fácil. Vea mi solución en este enlace. Puede ayudar.Respuesta de la pregunta de edición de moneda

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top