Domanda

Sto cercando di creare un'espressione regolare per la mia app Android in modo che la valuta sia formattata come nella risposta superiore a questa domanda:

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());
    }

}

Input di denaro Android con decimale fisso

Voglio essere in grado di avere lo stesso formato di quell'esempio raggiunge solo meno il simbolo del dollaro prima dei numeri, ma non sono sicuro di come modificare quel codice per raggiungerlo, o esiste un modo alternativo?

Modificare: Dopo altri commenti mi sono evidenti, potrebbe non essere questo particolare pezzo del mio codice. Posso farci funzionare usando un allenamento molto sciocco cambiando il segno del dollaro per uno spazio vuoto nell'espressione regolare ed entrando in uno spazio vuoto prima dei numeri, tagliandolo in seguito quando ho bisogno del valore, ma non riesco a trovare un meglio Lavorare.

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 per la scatola

 <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" />
È stato utile?

Soluzione

Hai: <EditText ... android:digits="0123456789." ... />

Eppure la tua espressione regolare ha \\$(\\d{1,3}.... Che si traduce in "cartello in dollari seguito da più cifre".

Penso che il sistema sia confuso sul fatto che tu sia richiesto che sia presente un segno in dollari, ma proibirelo nel tuo XML.

Vorrei eliminare la prima parte della tua espressione regolare e mettere l'accesso in dollari per l'utente.

Altri suggerimenti

Rimuovere questa linea

cashAmountBuilder.insert(0, '$');

Tutto quello che devi fare per eliminare il simbolo del dollaro è eliminare questa linea: cashamountbuilder.insert (0, '$');.

Penso che tu stia cercando di fare troppo che il sistema può già fare per te. Se mantieni il valore di valuta come doppio internamente e lo forma solo quando si desidera visualizzarlo, è molto più facile. Guarda la mia soluzione in questo link. Può aiutare.Risposta alla domanda di modifica valutaria

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top