Vírgula separadora decimal (',') com numberDecimal inputType em EditText


133

O inputType numberDecimalin EditTextusa o ponto '.' como separador decimal. Na Europa, é comum usar uma vírgula ','. Embora meu código de idioma esteja definido como alemão, o separador decimal ainda é o '.'

Existe uma maneira de obter a vírgula como separador decimal?



1
esse bug foi finalmente corrigido no Android O: issuetracker.google.com/issues/36907764
Lovis

eles dizem que é fixo, mas não posso confirmar isso? você pode?
sebastian

5
Posso confirmar que NÃO está corrigido, pelo menos no meu Nexus 4 com Android 8.1 (também conhecido como LineageOS 15.1). Com Configurações-> Idioma definido como Francês (França), um EditText com android: inputType = "numberDecimal" oferece o separador ',' (vírgula), mas ainda se recusa a aceitar a vírgula. O 'oferecido'. (ponto decimal) é aceito. Faz mais de 9 anos desde que esse bug foi relatado pela primeira vez. Isso é algum tipo de registro? Coxo.
pete

Respostas:


105

Uma solução alternativa (até o Google corrigir esse bug) é usar um EditTextcom android:inputType="numberDecimal"e android:digits="0123456789.,".

Em seguida, adicione um TextChangedListener ao EditText com o seguinte 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 para que a vírgula (,) seja exibida no teclado depende do idioma definido no seu dispositivo. Se sua entrada tiver o tipo numberDecimal e seu idioma for inglês (Estados Unidos), será exibido nos dispositivos Nexus (referência). É possível que dispositivos não Nexus não respeitam esta
hcpl

11
Funciona, mas esteja ciente de que permite que um texto como "24,22,55" seja exibido. Pode ser necessário adicionar alguma validação adicional para corrigir isso!
dimsuz

8
Ainda é este o caminho?
Willi Mentzel

Melhor ainda, use char localizedSeparator = DecimalFormatSymbols.getInstance (). GetDecimalSeparator (); localizedFloatString = localizedFloatString.replace ('.', localizedSeparator);
Southerton #

4
Parece que isso é apenas trocar um bug por outro. Conforme implementado acima, isso funcionará para localidades que usam, em vez de. ao custo do reverso, que é mais comum em todo o mundo. O ajuste do @ southerton ajuda com isso, no entanto, seus usuários podem se surpreender quando atingem um. e tenha a, apareça na entrada.
21417 Nick

30

Uma variação nas soluções de 'dígitos' oferecidas aqui:

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

Levando em conta o separador de localidade.


Essa é a resposta mais clara para a pergunta original. Graças
peter.bartos

Coloque isso em onCreate (), este é o caminho a percorrer, IMHO.
TechNyquist

6
Gosto disso, mas tenha cuidado ... existem teclados que não se importam com a localidade do usuário, portanto, o usuário que não tem a chave ,em seus teclados. Exemplos: teclado Samsung (KitKat).
Brais Gabin 30/10

2
Isso permitirá separadores decimais duplicados. Veja a resposta abaixo para lidar com isso: stackoverflow.com/a/45384821/6138589
Esdras Lopez

19

Máscara de moeda do código a seguir para EditText ($ 123,125.155)

Layout XML

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

Código

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

Este é um bug conhecido no Android SDK. A única solução alternativa é criar seu próprio teclado virtual. Você pode encontrar um exemplo de implementação aqui .


15
Há notícias depois de quatro anos?
Antonio Sesto

Experimentando isso no Xamarin.Forms também. A cultura é {se-SV} e o numpad mostra bot "," (separador decimal) e "." (mil separador de grupo), mas após pressionar a "" nada é inserido no campo de texto e nenhum evento é gerado
joacar

Posso confirmar que o bug ainda existe.
Lensflare

fixo no Android O Developer Preview
R00We

6

A resposta de Martins não funcionará se você estiver instanciando o EditText programaticamente. Fui em frente e modifiquei a DigitsKeyListenerclasse incluída da API 14 para permitir vírgula e ponto como separador decimal.

Para usar isso, chame setKeyListener()o EditText, por exemplo,

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

No entanto, você ainda precisa usar o truque de Martin no local TextChangedListeneronde substitui vírgulas por pontos

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

do doc: KeyListener deve ser usado apenas nos casos em que um aplicativo possui seu próprio teclado na tela e também deseja processar eventos do teclado físico para corresponder a ele. developer.android.com/reference/android/text/method/…
Loda

6

você pode usar o seguinte para diferentes localidades

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

Esta é a melhor solução para mim, mas há problemas com alguns telefones, como a Samsung, que não mostram o coma "," no teclado. Então, eu mudei isso para permitir coma e dot, mas substituindo de acordo com o
código

5

Você pode usar a seguinte solução alternativa para incluir também vírgula como uma entrada válida: -

Através do XML:

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

Programaticamente:

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

Desta forma, o sistema Android mostrará o teclado dos números e permitirá a entrada de vírgula. Espero que isso responda à pergunta :)


Com esta solução, quando você toca em ",", mas o texto de edição mostra "."
Mara Jimenez

2

Para soluções Mono (Droid):

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

1

Você pode fazer o seguinte:

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

E então você poderia usar um filtro de entrada:

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

}


pode haver um espaço entre mil e cem, este padrão se recusaria a entrada formatada
Eric Zhao

1

IMHO, a melhor abordagem para esse problema é usar apenas o InputFilter. Uma boa essência é aqui DecimalDigitsInputFilter . Então você pode apenas:

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

Funcionou como um encanto, obrigado! (depois de tantas soluções erradas acima ... :() Mas eu tenho uma pergunta: Como posso obter essa vírgula (",") exibida na tela e não ponto (".") porque na Hungria usamos vírgula como separador decimal .
Abigail La'Fay

1
A configuração android: digits = "0123456789," pode ser adicionada ao EditText. Além disso, em vez de retornar nulo no DecimalDigitsInputFilter, você pode retornar source.replace (".", ",") De acordo com a resposta stackoverflow.com/a/40020731/1510222, não há como ocultar pontos em um teclado padrão
Arkadiusz Cieśliński

1

para localizar sua entrada use:

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

e depois adicione:

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

do que não se esqueça de substituir "," por "." então Float ou Double pode analisá-lo sem erros.


1
Esta solução permite entrar várias vírgulas
Leo Droidcoder

1

Todas as outras postagens aqui tinham grandes falhas, então aqui está uma solução que irá:

  • Aplicar vírgulas ou pontos com base na região, não permitirá que você digite o oposto.
  • Se o EditText iniciar com algum valor, ele substituirá o separador correto, conforme necessário.

No XML:

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

Variável de classe:

private boolean isDecimalSeparatorComma = false;

No onCreate, localize o separador usado no código do idioma atual:

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

Também em Criar, use-o para atualizá-lo se você estiver carregando um valor atual:

// 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

Também emCriar, Adicionar ouvintes

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

exemplo doSomething (), converta em período padrão para manipulação de dados

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

O Android possui um formatador de números embutido.

Você pode adicionar isso ao seu EditTextpara permitir decimais e vírgulas: android:inputType="numberDecimal"eandroid:digits="0123456789.,"

Em algum lugar do código, quando o usuário clica em salvar ou após a inserção do texto (use um ouvinte).

// 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

Decidi mudar a vírgula para pontilhar apenas durante a edição. Aqui está minha solução simples e complicada 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 usará vírgula ou ponto depende da localidade


0

Não sei por que suas respostas são tão complicadas. Se houver um erro no SDK, você deve substituí-lo ou dar a volta.

Eu escolhi a segunda maneira de resolver esse problema. Se você formatar sua sequência como Locale.ENGLISHe depois colocá-la em EditText(mesmo como uma sequência vazia). Exemplo:

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

Perseguindo essa solução, seu resultado é compatível com o teclado mostrado. Em seguida, números flutuantes e duplos funcionam normalmente para linguagens de programação, com ponto em vez de vírgula.


0

Minha solução é:

  • Na atividade principal:

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

  • No arquivo xml: android:imeOptions="flagNoFullscreen" android:inputType="numberDecimal"

e eu peguei o dobro no editText como uma String.


0

Posso confirmar que as correções propostas não funcionam nos IMEs da Samsung (pelo menos no S6 e S9) e talvez na LG. Eles ainda mostram um ponto como separador decimal, independentemente da localidade. Mudar para o IME do Google corrige isso, mas dificilmente é uma opção para a maioria dos desenvolvedores.

Também não foi corrigido no Oreo para esses teclados, pois é uma correção que a Samsung e / ou a LG precisam fazer e, em seguida, empurrar até seus aparelhos antigos.

Em vez disso, bifurquei o projeto do teclado numérico e adicionei um modo em que ele se comporta como um garfo IME : . Veja a amostra do projeto para obter detalhes. Isso funcionou muito bem para mim e é semelhante a muitos dos IMEs falsos de "entrada de PIN" que você vê nos aplicativos bancários.

Exemplo de captura de tela do aplicativo


0

Já passaram mais de 8 anos e estou surpreso, esse problema ainda não foi resolvido ... Lutei
com esse problema simples, pois a resposta mais votada por @Martin permite digitar vários separadores, ou seja, o usuário pode digitar "12 ,,, ,,, 12,1,, 21,2, "
Além disso, a segunda preocupação é que, em alguns dispositivos, a vírgula não é mostrada no teclado numérico (ou requer o pressionamento múltiplo de um botão de ponto)

Aqui está minha solução alternativa, que resolve os problemas mencionados e permite que o usuário digite '.' e ',', mas em EditText ele verá o único separador decimal que corresponde à localidade atual:

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

E o observador de texto:

  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

Solução simples, faça um controle personalizado. (isso é feito no Android Xamarin, mas deve ser portado facilmente para 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

Você pode usar inputType="phone", no entanto, nesse caso, você teria que lidar com vários ,ou .estar presente, portanto, uma validação adicional seria necessária.


-1

Eu acho que essa solução é menos complexa do que as outras escritas aqui:

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

Dessa forma, quando você pressiona o '.' no teclado virtual nada acontece; somente números e vírgulas são permitidos.


4
se você fizer isso, apenas quebrará todos os códigos de idioma que usam '.' em vez de.
21417 Nick
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.