Separatore decimale virgola (',') con numberDecimal inputType in EditText


133

In inputType numberDecimalin EditTextusa il punto '.' come separatore decimale. In Europa è invece comune usare una virgola ','. Anche se il mio locale è impostato come tedesco, il separatore decimale è ancora il '.'

C'è un modo per ottenere la virgola come separatore decimale?



1
questo bug è stato finalmente risolto in Android O: issuetracker.google.com/issues/36907764
Lovis

dicono che è stato risolto ma non posso confermarlo? Puoi?
sebastian,

5
Posso confermare che NON è stato risolto, almeno sul mio Nexus 4 con Android 8.1 (aka LineageOS 15.1). Con Impostazioni-> Lingua impostata su Francese (Francia), un testo di modifica con Android: inputType = "numberDecimal" offre il separatore ',' (virgola) ma rifiuta comunque di accettare la virgola. L'offerta "." (punto decimale) è accettato. Sono passati più di 9 anni dalla prima segnalazione di questo errore. È una specie di disco? Noioso.
pete,

Risposte:


105

Una soluzione alternativa (fino a quando Google non risolve questo errore) è utilizzare un EditTextcon android:inputType="numberDecimal"e android:digits="0123456789.,".

Quindi aggiungere un TextChangedListener a EditText con il seguente afterTextChanged:

public void afterTextChanged(Editable s) {
    double doubleValue = 0;
    if (s != null) {
        try {
            doubleValue = Double.parseDouble(s.toString().replace(',', '.'));
        } catch (NumberFormatException e) {
            //Error
        }
    }
    //Do something with doubleValue
}

1
@Zoombie per la virgola (,) da mostrare sulla tastiera dipende dalla lingua impostata sul dispositivo. Se il tuo input ha il numero di tipo Decimale e la tua lingua è l'inglese (Stati Uniti), verrà visualizzato sui dispositivi Nexus (riferimento). È possibile che i dispositivi non Nexus non lo rispettino
hcpl

11
Funziona, ma tieni presente che lascia passare un testo come "24,22,55". Potrebbe essere necessario aggiungere qualche ulteriore convalida per risolvere questo problema!
dimsuz,

8
È ancora questa la strada da percorrere?
Willi Mentzel,

Ancora meglio, usa char localizedSeparator = DecimalFormatSymbols.getInstance (). GetDecimalSeparator (); localizedFloatString = localizedFloatString.replace ('.', localizedSeparator);
southerton,

4
Sembra che questo sia solo scambiare un bug con un altro. Come implementato sopra, questo funzionerà per i locali che usano, invece di. al costo del contrario, che è più comune in tutto il mondo. La modifica di @ southerton aiuta a farlo, tuttavia i tuoi utenti potrebbero essere sorpresi quando colpiscono un. e avere un, apparire nell'input.
Nick

30

Una variazione sulle soluzioni 'digit' offerte qui:

char separator = DecimalFormatSymbols.getInstance().getDecimalSeparator();
input.setKeyListener(DigitsKeyListener.getInstance("0123456789" + separator));

Tenendo conto del separatore delle impostazioni internazionali.


Questa è la risposta più chiara alla domanda originale. Grazie
peter.bartos il

Inseriscilo in onCreate (), questa è la strada da percorrere, IMHO.
TechNyquist

6
Mi piace questo, ma fai attenzione ... ci sono tastiere a cui non interessa la localizzazione dell'utente, quindi l'utente che non ha il tasto ,nelle proprie tastiere. Esempi: tastiera Samsung (KitKat).
Brais Gabin,

2
Ciò consentirà separatori decimali duplicati. Vedi la risposta sotto per gestirlo: stackoverflow.com/a/45384821/6138589
Esdras Lopez

19

Maschera di valuta seguente codice per EditText ($ 123.125.155)

Layout XML

  <EditText
    android:inputType="numberDecimal"
    android:layout_height="wrap_content"
    android:layout_width="200dp"
    android:digits="0123456789.,$" />

Codice

EditText testFilter=...
testFilter.addTextChangedListener( new TextWatcher() {
        boolean isEdiging;
        @Override public void onTextChanged(CharSequence s, int start, int before, int count) { }
        @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override public void afterTextChanged(Editable s) {
            if(isEdiging) return;
            isEdiging = true;

            String str = s.toString().replaceAll( "[^\\d]", "" );
            double s1 = Double.parseDouble(str);

            NumberFormat nf2 = NumberFormat.getInstance(Locale.ENGLISH);
            ((DecimalFormat)nf2).applyPattern("$ ###,###.###");
            s.replace(0, s.length(), nf2.format(s1));

            isEdiging = false;
        }
    });

16

Questo è un bug noto nell'SDK di Android. L'unica soluzione è creare la tua tastiera virtuale. Puoi trovare un esempio di implementazione qui .


15
Ci sono novità dopo quattro anni?
Antonio Sesto,

Prova questo anche in Xamarin.Forms. La cultura è {se-SV} e il tastierino numerico mostra il bot "," (separatore decimale) e "." (separatore di migliaia di gruppi) ma premendo "," non viene inserito nulla nel campo di testo e non viene generato alcun evento
joacar,

Posso confermare che il bug esiste ancora.
Lensflare,

risolto in anteprima sviluppatore Android O
R00We

6

La risposta di Martins non funzionerà se si crea un'istanza a livello di codice EditText. Sono andato avanti e ho modificato la DigitsKeyListenerclasse inclusa da API 14 per consentire sia la virgola che il punto come separatore decimale.

Per utilizzare questo, chiamare setKeyListener()il EditText, ad es

// Don't allow for signed input (minus), but allow for decimal points
editText.setKeyListener( new MyDigitsKeyListener( false, true ) );

Tuttavia, devi ancora usare il trucco di Martin nel punto in TextChangedListenercui sostituisci le virgole con punti

import android.text.InputType;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.NumberKeyListener;
import android.view.KeyEvent;

class MyDigitsKeyListener extends NumberKeyListener {

    /**
     * The characters that are used.
     *
     * @see KeyEvent#getMatch
     * @see #getAcceptedChars
     */
    private static final char[][] CHARACTERS = new char[][] {
        new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' },
        new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-' },
        new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',' },
        new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '.', ',' },
    };

    private char[] mAccepted;
    private boolean mSign;
    private boolean mDecimal;

    private static final int SIGN = 1;
    private static final int DECIMAL = 2;

    private static MyDigitsKeyListener[] sInstance = new MyDigitsKeyListener[4];

    @Override
    protected char[] getAcceptedChars() {
        return mAccepted;
    }

    /**
     * Allocates a DigitsKeyListener that accepts the digits 0 through 9.
     */
    public MyDigitsKeyListener() {
        this(false, false);
    }

    /**
     * Allocates a DigitsKeyListener that accepts the digits 0 through 9,
     * plus the minus sign (only at the beginning) and/or decimal point
     * (only one per field) if specified.
     */
    public MyDigitsKeyListener(boolean sign, boolean decimal) {
        mSign = sign;
        mDecimal = decimal;

        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);
        mAccepted = CHARACTERS[kind];
    }

    /**
     * Returns a DigitsKeyListener that accepts the digits 0 through 9.
     */
    public static MyDigitsKeyListener getInstance() {
        return getInstance(false, false);
    }

    /**
     * Returns a DigitsKeyListener that accepts the digits 0 through 9,
     * plus the minus sign (only at the beginning) and/or decimal point
     * (only one per field) if specified.
     */
    public static MyDigitsKeyListener getInstance(boolean sign, boolean decimal) {
        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);

        if (sInstance[kind] != null)
            return sInstance[kind];

        sInstance[kind] = new MyDigitsKeyListener(sign, decimal);
        return sInstance[kind];
    }

    /**
     * Returns a DigitsKeyListener that accepts only the characters
     * that appear in the specified String.  Note that not all characters
     * may be available on every keyboard.
     */
    public static MyDigitsKeyListener getInstance(String accepted) {
        // TODO: do we need a cache of these to avoid allocating?

        MyDigitsKeyListener dim = new MyDigitsKeyListener();

        dim.mAccepted = new char[accepted.length()];
        accepted.getChars(0, accepted.length(), dim.mAccepted, 0);

        return dim;
    }

    public int getInputType() {
        int contentType = InputType.TYPE_CLASS_NUMBER;
        if (mSign) {
            contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED;
        }
        if (mDecimal) {
            contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL;
        }
        return contentType;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {
        CharSequence out = super.filter(source, start, end, dest, dstart, dend);

        if (mSign == false && mDecimal == false) {
            return out;
        }

        if (out != null) {
            source = out;
            start = 0;
            end = out.length();
        }

        int sign = -1;
        int decimal = -1;
        int dlen = dest.length();

        /*
         * Find out if the existing text has '-' or '.' characters.
         */

        for (int i = 0; i < dstart; i++) {
            char c = dest.charAt(i);

            if (c == '-') {
                sign = i;
            } else if (c == '.' || c == ',') {
                decimal = i;
            }
        }
        for (int i = dend; i < dlen; i++) {
            char c = dest.charAt(i);

            if (c == '-') {
                return "";    // Nothing can be inserted in front of a '-'.
            } else if (c == '.' ||  c == ',') {
                decimal = i;
            }
        }

        /*
         * If it does, we must strip them out from the source.
         * In addition, '-' must be the very first character,
         * and nothing can be inserted before an existing '-'.
         * Go in reverse order so the offsets are stable.
         */

        SpannableStringBuilder stripped = null;

        for (int i = end - 1; i >= start; i--) {
            char c = source.charAt(i);
            boolean strip = false;

            if (c == '-') {
                if (i != start || dstart != 0) {
                    strip = true;
                } else if (sign >= 0) {
                    strip = true;
                } else {
                    sign = i;
                }
            } else if (c == '.' || c == ',') {
                if (decimal >= 0) {
                    strip = true;
                } else {
                    decimal = i;
                }
            }

            if (strip) {
                if (end == start + 1) {
                    return "";  // Only one character, and it was stripped.
                }

                if (stripped == null) {
                    stripped = new SpannableStringBuilder(source, start, end);
                }

                stripped.delete(i - start, i + 1 - start);
            }
        }

        if (stripped != null) {
            return stripped;
        } else if (out != null) {
            return out;
        } else {
            return null;
        }
    }
}

da doc: KeyListener dovrebbe essere usato solo nei casi in cui un'applicazione ha la propria tastiera su schermo e vuole anche elaborare eventi di tastiera rigida per abbinarla. developer.android.com/reference/android/text/method/…
Loda

6

è possibile utilizzare quanto segue per diverse impostazioni locali

private void localeDecimalInput(final EditText editText){

    DecimalFormat decFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault());
    DecimalFormatSymbols symbols=decFormat.getDecimalFormatSymbols();
    final String defaultSeperator=Character.toString(symbols.getDecimalSeparator());

    editText.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            if(editable.toString().contains(defaultSeperator))
                editText.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
            else
                editText.setKeyListener(DigitsKeyListener.getInstance("0123456789" + defaultSeperator));
        }
    });
}

Questa è la soluzione migliore per me, ma ci sono problemi con alcuni telefoni, ad esempio Samsung, che non mostrano il "," coma sulla tastiera. Quindi ho cambiato questo per consentire sia il coma che il punto, ma poi sostituendo di conseguenza le
impostazioni

5

È possibile utilizzare la seguente soluzione alternativa per includere anche la virgola come input valido: -

Tramite XML:

<EditText
    android:inputType="number"
    android:digits="0123456789.," />

livello di programmazione:

EditText input = new EditText(THE_CONTEXT);
input.setKeyListener(DigitsKeyListener.getInstance("0123456789.,"));

In questo modo il sistema Android mostrerà la tastiera dei numeri e consentirà l'inserimento di una virgola. Spero che questo risponda alla domanda :)


Con questa soluzione quando si tocca ",", ma il testo di modifica mostra "."
Mara Jimenez,

2

Per soluzioni Mono (Droid):

decimal decimalValue = decimal.Parse(input.Text.Replace(",", ".") , CultureInfo.InvariantCulture);

1

Puoi fare quanto segue:

DecimalFormatSymbols d = DecimalFormatSymbols.getInstance(Locale.getDefault());
input.setFilters(new InputFilter[] { new DecimalDigitsInputFilter(5, 2) });
input.setKeyListener(DigitsKeyListener.getInstance("0123456789" + d.getDecimalSeparator()));

E quindi è possibile utilizzare un filtro di input:

    public class DecimalDigitsInputFilter implements InputFilter {

Pattern mPattern;

public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
    DecimalFormatSymbols d = new DecimalFormatSymbols(Locale.getDefault());
    String s = "\\" + d.getDecimalSeparator();
    mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((" + s + "[0-9]{0," + (digitsAfterZero - 1) + "})?)||(" + s + ")?");
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

    Matcher matcher = mPattern.matcher(dest);
    if (!matcher.matches())
        return "";
    return null;
}

}


ci potrebbe essere uno spazio tra le migliaia e le centinaia, questo schema rifiuta l'input formattato
Eric Zhao

1

IMHO l'approccio migliore per questo problema è semplicemente usare InputFilter. Una bella idea è qui DecimalDigitsInputFilter . Quindi puoi semplicemente:

editText.setInputType(TYPE_NUMBER_FLAG_DECIMAL | TYPE_NUMBER_FLAG_SIGNED | TYPE_CLASS_NUMBER)
editText.setKeyListener(DigitsKeyListener.getInstance("0123456789,.-"))
editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,2)});

Ha funzionato come un fascino, grazie! (dopo tante soluzioni sbagliate sopra ... :() Ma ho una domanda: come posso ottenere quella virgola (",") visualizzata sullo schermo non punto (".") perché in Ungheria usiamo la virgola come separatore decimale .
Abigail La'Fay

1
android: digits = "0123456789", è possibile aggiungere l'impostazione a EditText. Inoltre, invece di restituire null in DecimalDigitsInputFilter, puoi restituire source.replace (".", ",") In base alla risposta stackoverflow.com/a/40020731/1510222 non c'è modo di nascondere il punto in una tastiera standard
Arkadiusz Cieśliński

1

per localizzare il tuo input usa:

char sep = DecimalFormatSymbols.getInstance().getDecimalSeparator();

e quindi aggiungere:

textEdit.setKeyListener(DigitsKeyListener.getInstance("0123456789" + sep));

di non dimenticare di sostituire "," con "." così Float o Double possono analizzarlo senza errori.


1
Questa soluzione consente di inserire più virgole
Leo Droidcoder il

1

Tutti gli altri post qui avevano dei buchi importanti, quindi ecco una soluzione che:

  • Applicare virgole o punti in base alla regione, non ti permetterà di digitare quello opposto.
  • Se EditText inizia con un valore, sostituisce il separatore corretto secondo necessità.

Nell'XML:

<EditText
    ...
    android:inputType="numberDecimal" 
    ... />

Variabile di classe:

private boolean isDecimalSeparatorComma = false;

In onCreate, trova il separatore utilizzato nella locale corrente:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    NumberFormat nf = NumberFormat.getInstance();
    if (nf instanceof DecimalFormat) {
        DecimalFormatSymbols sym = ((DecimalFormat) nf).getDecimalFormatSymbols();
        char decSeparator = sym.getDecimalSeparator();
        isDecimalSeparatorComma = Character.toString(decSeparator).equals(",");
    }
}

Anche onCreate, usa questo per aggiornarlo se stai caricando un valore corrente:

// Replace editText with commas or periods as needed for viewing
String editTextValue = getEditTextValue(); // load your current value
if (editTextValue.contains(".") && isDecimalSeparatorComma) {
    editTextValue = editTextValue.replaceAll("\\.",",");
} else if (editTextValue.contains(",") && !isDecimalSeparatorComma) {
    editTextValue = editTextValue.replaceAll(",",".");
}
setEditTextValue(editTextValue); // override your current value

Inoltre su Crea, aggiungi i listener

editText.addTextChangedListener(editTextWatcher);

if (isDecimalSeparatorComma) {
    editText.setKeyListener(DigitsKeyListener.getInstance("0123456789,"));
} else {
    editText.setKeyListener(DigitsKeyListener.getInstance("0123456789."));
}

editTextWatcher

TextWatcher editTextWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) { }

    @Override
    public void afterTextChanged(Editable s) {
        String editTextValue = s.toString();

        // Count up the number of commas and periods
        Pattern pattern = Pattern.compile("[,.]");
        Matcher matcher = pattern.matcher(editTextValue);
        int count = 0;
        while (matcher.find()) {
            count++;
        }

        // Don't let it put more than one comma or period
        if (count > 1) {
            s.delete(s.length()-1, s.length());
        } else {
            // If there is a comma or period at the end the value hasn't changed so don't update
            if (!editTextValue.endsWith(",") && !editTextValue.endsWith(".")) {
                doSomething()
            }
        }
    }
};

Esempio doSomething (), conversione in periodo standard per la manipolazione dei dati

private void doSomething() {
    try {
        String editTextStr = editText.getText().toString();
        if (isDecimalSeparatorComma) {
            editTextStr = editTextStr.replaceAll(",",".");
        }
        float editTextFloatValue = editTextStr.isEmpty() ?
                0.0f :
                Float.valueOf(editTextStr);

        ... use editTextFloatValue
    } catch (NumberFormatException e) {
        Log.e(TAG, "Error converting String to Double");
    }
}

0

Android ha un formattatore di numeri integrato.

Puoi aggiungere questo al tuo EditTextper consentire decimali e virgole: android:inputType="numberDecimal"eandroid:digits="0123456789.,"

Quindi da qualche parte nel codice, quando l'utente fa clic su Salva o dopo aver inserito il testo (utilizzare un listener).

// Format the number to the appropriate double
try { 
    Number formatted = NumberFormat.getInstance().parse(editText.getText().toString());
    cost = formatted.doubleValue();
} catch (ParseException e) {
    System.out.println("Error parsing cost string " + editText.getText().toString());
    cost = 0.0;
}

0

Ho deciso di cambiare la virgola in punto solo durante la modifica. Ecco la mia soluzione semplice, delicata e relativa:

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            EditText editText = (EditText) v; 
            String text = editText.getText().toString();
            if (hasFocus) {
                editText.setText(text.replace(",", "."));
            } else {
                if (!text.isEmpty()) {
                    Double doubleValue = Double.valueOf(text.replace(",", "."));
                    editText.setText(someDecimalFormatter.format(doubleValue));
                }
            }
        }
    });

someDecimalFormatter utilizzerà la virgola o il punto dipende dalle impostazioni internazionali


0

Non so perché le tue risposte siano così complicate. Se c'è un bug nell'SDK, devi scavalcarlo o andare in giro.

Ho scelto il secondo modo per risolvere quel problema. Se si formatta la stringa come Locale.ENGLISHe quindi la si inserisce nella EditText(anche come stringa vuota). Esempio:

String.format(Locale.ENGLISH,"%.6f", yourFloatNumber);

Inseguendo quella soluzione, i risultati sono compatibili con la tastiera mostrata. Quindi float e numeri doppi funzionano in modo tipico per i linguaggi di programmazione con punto anziché virgola.


0

La mia soluzione è:

  • Nell'attività principale:

    char separator =DecimalFormatSymbols.getInstance().getDecimalSeparator(); textViewPitchDeadZone.setKeyListener(DigitsKeyListener.getInstance("0123456789" + separator));

  • Nel file XML: android:imeOptions="flagNoFullscreen" android:inputType="numberDecimal"

e ho preso il doppio in editText come una stringa.


0

Posso confermare che le correzioni proposte non funzionano su Samsung IME (almeno su S6 e S9) e forse su LG. Mostrano comunque un punto come separatore decimale indipendentemente dalle impostazioni locali. Il passaggio all'IME di Google risolve questo problema, ma difficilmente è un'opzione per la maggior parte degli sviluppatori.

Inoltre, non è stato risolto in Oreo per queste tastiere poiché è una correzione che Samsung e / o LG devono fare e quindi spingere anche sui loro telefoni antichi.

Ho invece modificato il progetto della tastiera numerica e ho aggiunto una modalità in cui si comporta come un IME: fork . Vedi l'esempio del progetto per i dettagli. Questo ha funzionato abbastanza bene per me ed è simile a molti degli IME falsi "immissione PIN" che vedi nelle app bancarie.

Schermata di esempio dell'app


0

Sono trascorsi più di 8 anni e sono sorpreso, questo problema non è stato ancora risolto ...
Ho lottato con questo semplice problema poiché la risposta più votata da @Martin consente di digitare più separatori, ovvero l'utente può digitare "12 ,,, ,,, 12,1,, 21,2, "
Inoltre, la seconda preoccupazione è che su alcuni dispositivi la virgola non è mostrata sulla tastiera numerica (o richiede la pressione multipla di un pulsante punto)

Ecco la mia soluzione alternativa, che risolve i problemi citati e consente all'utente di digitare "." e ',', ma in EditText vedrà l'unico separatore decimale che corrisponde alla locale corrente:

editText.apply { addTextChangedListener(DoubleTextChangedListener(this)) }

E il watcher del testo:

  open class DoubleTextChangedListener(private val et: EditText) : TextWatcher {

    init {
        et.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
        et.keyListener = DigitsKeyListener.getInstance("0123456789.,")
    }

    private val separator = DecimalFormatSymbols.getInstance().decimalSeparator

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        //empty
    }

    @CallSuper
    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
        et.run {
            removeTextChangedListener(this@DoubleTextChangedListener)
            val formatted = toLocalizedDecimal(s.toString(), separator)
            setText(formatted)
            setSelection(formatted.length)
            addTextChangedListener(this@DoubleTextChangedListener)
        }
    }

    override fun afterTextChanged(s: Editable?) {
        // empty
    }

    /**
     * Formats input to a decimal. Leaves the only separator (or none), which matches [separator].
     * Examples:
     * 1. [s]="12.12", [separator]=',' -> result= "12,12"
     * 2. [s]="12.12", [separator]='.' -> result= "12.12"
     * 4. [s]="12,12", [separator]='.' -> result= "12.12"
     * 5. [s]="12,12,,..,,,,,34..,", [separator]=',' -> result= "12,1234"
     * 6. [s]="12.12,,..,,,,,34..,", [separator]='.' -> result= "12.1234"
     * 7. [s]="5" -> result= "5"
     */
    private fun toLocalizedDecimal(s: String, separator: Char): String {
        val cleared = s.replace(",", ".")
        val splitted = cleared.split('.').filter { it.isNotBlank() }
        return when (splitted.size) {
            0 -> s
            1 -> cleared.replace('.', separator).replaceAfter(separator, "")
            2 -> splitted.joinToString(separator.toString())
            else -> splitted[0]
                    .plus(separator)
                    .plus(splitted.subList(1, splitted.size - 1).joinToString(""))
        }
    }
}

0

Soluzione semplice, crea un controllo personalizzato. (questo è realizzato in Xamarin Android ma dovrebbe essere facilmente trasferito su Java)

public class EditTextDecimalNumber:EditText
{
    readonly string _numberFormatDecimalSeparator;

    public EditTextDecimalNumber(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        InputType = InputTypes.NumberFlagDecimal;
        TextChanged += EditTextDecimalNumber_TextChanged;
        _numberFormatDecimalSeparator = System.Threading.Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator;

        KeyListener = DigitsKeyListener.GetInstance($"0123456789{_numberFormatDecimalSeparator}");
    }

    private void EditTextDecimalNumber_TextChanged(object sender, TextChangedEventArgs e)
    {
        int noOfOccurence = this.Text.Count(x => x.ToString() == _numberFormatDecimalSeparator);
        if (noOfOccurence >=2)
        {
            int lastIndexOf = this.Text.LastIndexOf(_numberFormatDecimalSeparator,StringComparison.CurrentCulture);
            if (lastIndexOf!=-1)
            {
                this.Text = this.Text.Substring(0, lastIndexOf);
                this.SetSelection(this.Text.Length);
            }

        }
    }
}

0

Potresti usare inputType="phone", tuttavia in quel caso dovresti avere a che fare con multipli ,o .essere presenti, quindi sarebbe necessaria un'ulteriore convalida.


-1

Penso che questa soluzione sia meno complessa delle altre scritte qui:

<EditText
    android:inputType="numberDecimal"
    android:digits="0123456789," />

In questo modo quando si preme il '.' nella tastiera software non succede nulla; sono ammessi solo numeri e virgole.


4
se lo fai, allora spezzerai tutte le impostazioni locali che usano "." anziché.
Nick
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.