Question

Je suis en train de créer une expression régulière pour mon application Android afin que la monnaie est formaté comme dans la partie supérieure réponse à cette question:

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

}

Android argent avec entrée décimale fixe

Je veux être en mesure d'avoir le même format que cet exemple atteint juste moins le symbole du dollar avant les chiffres, mais je ne suis vraiment pas sûr de la façon de modifier ce code pour y parvenir, ou est-il une alternative?

Modifier : Après plus commente son apparente pour moi, il pourrait ne pas être ce morceau particulier de mon code. Je peux obtenir ce travail à l'aide d'une séance d'entraînement très stupide en changeant le signe de dollar pour un espace vide dans l'expression régulière et entrer dans un espace vide avant les chiffres, la coupe plus tard quand j'ai besoin de la valeur, mais je suis incapable de trouver un meilleur contourner.

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 pour la boîte

 <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" />
Était-ce utile?

La solution

Vous avez: <EditText ... android:digits="0123456789." ... />

et pourtant l'expression régulière a \\$(\\d{1,3}.... Ce qui se traduit par « signe dollar suivi par plus de chiffres. »

Je pense que le système est confus que vous IMPOSANT un signe de dollar soit présent, mais l'interdire dans votre XML.

je prendrais la première partie de votre expression régulière et mettre le signe dollar pour l'utilisateur.

Autres conseils

Supprimer cette ligne

cashAmountBuilder.insert(0, '$');

Tout ce que vous devez faire pour prendre le symbole du dollar est de prendre cette ligne. CashAmountBuilder.insert (0, « $ »);

Je pense que vous essayez de faire trop que le système déjà peut faire pour vous. Si vous maintenez la valeur de la monnaie en tant que double en interne et en forme que lorsque vous voulez afficher, il est beaucoup plus facile. Voir ma solution dans ce lien. Il peut être utile. réponse modifier la question de la monnaie

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top