Comment append automatiquement mille séparateurs lorsque le nombre est entré dans EditText

En créant une application de conversion, je veux définir le EditText de sorte que lorsque l’utilisateur entre le nombre à convertir, un séparateur de milliers (,) doit être ajouté automatiquement au nombre en temps réel lorsqu’il augmente de 3 chiffres. mille, millions, milliards, etc., et effacé en dessous de 4 chiffres, le nombre revient à la normale. De l’aide? Je vous remercie.

Vous pouvez utiliser Ssortingng.format() dans un TextWatcher . La virgule dans le spécificateur de format fait l’affaire.

Cela ne fonctionne pas pour l’entrée en virgule flottante. Et faites attention à ne pas définir une boucle infinie avec le TextWatcher.

 public void afterTextChanged(Editable view) { Ssortingng s = null; try { // The comma in the format specifier does the sortingck s = Ssortingng.format("%,d", Long.parseLong(view.toSsortingng())); } catch (NumberFormatException e) { } // Set s back to the view after temporarily removing the text change listener } 

Résolu le problème enfin

Même si c’est trop tard, répondez. J’ai fait beaucoup de recherches pour accomplir la tâche Pour obtenir le bon résultat mais je n’ai pas pu. J’ai finalement résolu le problème que nous recherchions et fourni cette réponse aux chercheurs de Google pour leur permettre de gagner du temps lors de la recherche.

Fetures des codes suivants

  1. Met un séparateur de milliers dans EditText à EditText que le texte change.

  2. ajoute 0. Automatiquement lorsque la période est pressée (.) D’abord.

  3. Ignore 0 entrée au début.

Il suffit de copier la classe suivante nommée

NumberTextWatcherForThousand qui implémente TextWatcher

 import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import java.util.SsortingngTokenizer; /** * Created by skb on 12/14/2015. */ public class NumberTextWatcherForThousand implements TextWatcher { EditText editText; public NumberTextWatcherForThousand(EditText editText) { this.editText = editText; } @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) { try { editText.removeTextChangedListener(this); Ssortingng value = editText.getText().toSsortingng(); if (value != null && !value.equals("")) { if(value.startsWith(".")){ editText.setText("0."); } if(value.startsWith("0") && !value.startsWith("0.")){ editText.setText(""); } Ssortingng str = editText.getText().toSsortingng().replaceAll(",", ""); if (!value.equals("")) editText.setText(getDecimalFormattedSsortingng(str)); editText.setSelection(editText.getText().toSsortingng().length()); } editText.addTextChangedListener(this); return; } catch (Exception ex) { ex.printStackTrace(); editText.addTextChangedListener(this); } } public static Ssortingng getDecimalFormattedSsortingng(Ssortingng value) { SsortingngTokenizer lst = new SsortingngTokenizer(value, "."); Ssortingng str1 = value; Ssortingng str2 = ""; if (lst.countTokens() > 1) { str1 = lst.nextToken(); str2 = lst.nextToken(); } Ssortingng str3 = ""; int i = 0; int j = -1 + str1.length(); if (str1.charAt( -1 + str1.length()) == '.') { j--; str3 = "."; } for (int k = j;; k--) { if (k < 0) { if (str2.length() > 0) str3 = str3 + "." + str2; return str3; } if (i == 3) { str3 = "," + str3; i = 0; } str3 = str1.charAt(k) + str3; i++; } } public static Ssortingng sortingmCommaOfSsortingng(Ssortingng ssortingng) { // Ssortingng returnSsortingng; if(ssortingng.contains(",")){ return ssortingng.replace(",","");} else { return ssortingng; } } } 

Utilisez cette classe sur votre EditText comme suit

 editText.addTextChangedListener(new NumberTextWatcherForThousand(editText)); 

Pour obtenir l’entrée en texte simple

Utilisez la méthode sortingmCommaOfSsortingng de la même classe comme celle-ci

 NumberTextWatcherForThousand.sortingmCommaOfSsortingng(editText.getText().toSsortingng()) 

Git

  public static Ssortingng doubleToSsortingngNoDecimal(double d) { DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);; formatter .applyPattern("#,###"); return formatter.format(d); } 

Cet exemple d’application décompose clairement les nombres.

Pour résumer le lien ci-dessus, utilisez un TextWatcher et dans la méthode afterTextChanged() , formatez la vue EditText avec la logique suivante:

 @Override public void afterTextChanged(Editable s) { editText.removeTextChangedListener(this); try { Ssortingng originalSsortingng = s.toSsortingng(); Long longval; if (originalSsortingng.contains(",")) { originalSsortingng = originalSsortingng.replaceAll(",", ""); } longval = Long.parseLong(originalSsortingng); DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US); formatter.applyPattern("#,###,###,###"); Ssortingng formattedSsortingng = formatter.format(longval); //setting text after format to EditText editText.setText(formattedSsortingng); editText.setSelection(editText.getText().length()); } catch (NumberFormatException nfe) { nfe.printStackTrace(); } editText.addTextChangedListener(this); } 

Cette solution présente certains avantages par rapport aux autres réponses. Par exemple, il conserve la position du curseur de l’utilisateur même s’il modifie le début ou le milieu du numéro. D’autres solutions sautent toujours le curseur à la fin du numéro . Il gère les nombres décimaux et les nombres entiers , ainsi que les parameters régionaux qui utilisent des caractères autres que . pour le séparateur décimal et , pour le séparateur de regroupement des milliers.

 class SeparateThousands(val groupingSeparator: Ssortingng, val decimalSeparator: Ssortingng) : TextWatcher { private var busy = false override fun afterTextChanged(s: Editable?) { if (s != null && !busy) { busy = true var place = 0 val decimalPointIndex = s.indexOf(decimalSeparator) var i = if (decimalPointIndex == -1) { s.length - 1 } else { decimalPointIndex - 1 } while (i >= 0) { val c = s[i] if (c == ',') { s.delete(i, i + 1) } else { if (place % 3 == 0 && place != 0) { // insert a comma to the left of every 3rd digit (counting from right to // left) unless it's the leftmost digit s.insert(i + 1, groupingSeparator) } place++ } i-- } busy = false } } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { } } 

Puis en xml:

   

Et enfin enregistrer l’observateur:

 findViewById(R.id.myNumberField).addTextChangedListener( SeparateThousands(groupingSeparator, decimalSeparator)) 

Gérer . vs, dans différents parameters régionaux, utilisez groupingSeparator et decimalSeparator, qui peuvent provenir de DecimalFormatSymbols ou de chaînes localisées.

vous pouvez utiliser ce code de nombreuses manières dans votre programme, vous lui donnez une chaîne et il sépare les trois de droite et place des espaces.

 private Ssortingng Spacer(Ssortingng number){ SsortingngBuilder strB = new SsortingngBuilder(); strB.append(number); int Three = 0; for(int i=number.length();i>0;i--){ Three++; if(Three == 3){ strB.insert(i-1, " "); Three = 0; } } return strB.toSsortingng(); }// end Spacer() 

Vous pouvez le changer un peu et l’utiliser sur textchangelistener. bonne chance

Voici ma classe ThousandNumberEditText

 public class ThousandNumberEditText extends android.support.v7.widget.AppCompatEditText { // TODO: 14/09/2017 change it if you want private static final int MAX_LENGTH = 20; private static final int MAX_DECIMAL = 3; public ThousandNumberEditText(Context context) { this(context, null); } public ThousandNumberEditText(Context context, AtsortingbuteSet attrs) { this(context, attrs, android.support.v7.appcompat.R.attr.editTextStyle); } public ThousandNumberEditText(Context context, AtsortingbuteSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { addTextChangedListener(new ThousandNumberTextWatcher(this)); setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); setFilters(new InputFilter[] { new InputFilter.LengthFilter(MAX_LENGTH) }); setHint("0"); // TODO: 14/09/2017 change it if you want } private static class ThousandNumberTextWatcher implements TextWatcher { private EditText mEditText; ThousandNumberTextWatcher(EditText editText) { mEditText = editText; } @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { Ssortingng originalSsortingng = editable.toSsortingng(); Ssortingng cleanSsortingng = originalSsortingng.replaceAll("[,]", ""); if (cleanSsortingng.isEmpty()) { return; } Ssortingng formattedSsortingng = getFormatSsortingng(cleanSsortingng); mEditText.removeTextChangedListener(this); mEditText.setText(formattedSsortingng); mEditText.setSelection(mEditText.getText().length()); mEditText.addTextChangedListener(this); } /** * Return the format ssortingng */ private Ssortingng getFormatSsortingng(Ssortingng cleanSsortingng) { if (cleanSsortingng.contains(".")) { return formatDecimal(cleanSsortingng); } else { return formatInteger(cleanSsortingng); } } private Ssortingng formatInteger(Ssortingng str) { BigDecimal parsed = new BigDecimal(str); DecimalFormat formatter; formatter = new DecimalFormat("#,###"); return formatter.format(parsed); } private Ssortingng formatDecimal(Ssortingng str) { if (str.equals(".")) { return "."; } BigDecimal parsed = new BigDecimal(str); DecimalFormat formatter; formatter = new DecimalFormat("#,###." + getDecimalPattern(str)); //example patter #,###.00 return formatter.format(parsed); } /** * It will return suitable pattern for format decimal * For example: 10.2 -> return 0 | 10.23 -> return 00 | 10.235 -> return 000 */ private Ssortingng getDecimalPattern(Ssortingng str) { int decimalCount = str.length() - 1 - str.indexOf("."); SsortingngBuilder decimalPattern = new SsortingngBuilder(); for (int i = 0; i < decimalCount && i < MAX_DECIMAL; i++) { decimalPattern.append("0"); } return decimalPattern.toString(); } } } 

En utilisant

 <.ThousandNumberEditText android:layout_width="match_parent" android:layout_height="wrap_content" /> 

Je sais que je suis très en retard à la fête mais cela peut être très utile pour les futurs utilisateurs. Ma réponse est une extension de la réponse de Shree Krishna .

Améliorations:

  1. Des milliers de séparateurs et des marqueurs décimaux sont compatibles avec les parameters régionaux, c’est-à-dire qu’ils sont utilisés en fonction des parameters Locale du périphérique.
  2. La position du curseur ne change pas après la suppression ou l’ajout d’éléments au milieu (dans sa réponse, le curseur a été remis à la fin).
  3. La qualité globale du code a été améliorée, en particulier la méthode getDecimalFormattedSsortingng .

Code:

  import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import java.text.DecimalFormat; /** * Created by srv_twry on 4/12/17. * Source: https://stackoverflow.com/a/34265406/137744 * The custom TextWatcher that automatically adds thousand separators in EditText. */ public class ThousandSeparatorTextWatcher implements TextWatcher { private DecimalFormat df; private EditText editText; private static Ssortingng thousandSeparator; private static Ssortingng decimalMarker; private int cursorPosition; public ThousandSeparatorTextWatcher(EditText editText) { this.editText = editText; df = new DecimalFormat("#,###.##"); df.setDecimalSeparatorAlwaysShown(true); thousandSeparator = Character.toSsortingng(df.getDecimalFormatSymbols().getGroupingSeparator()); decimalMarker = Character.toSsortingng(df.getDecimalFormatSymbols().getDecimalSeparator()); } @Override public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { cursorPosition = editText.getText().toSsortingng().length() - editText.getSelectionStart(); } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} @Override public void afterTextChanged(Editable s) { try { editText.removeTextChangedListener(this); Ssortingng value = editText.getText().toSsortingng(); if (value != null && !value.equals("")) { if (value.startsWith(decimalMarker)) { Ssortingng text = "0" + decimalMarker; editText.setText(text); } if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) { int index = 0; while (index < value.length() && value.charAt(index) == '0') { index++; } String newValue = Character.toString(value.charAt(0)); if (index != 0) { newValue = value.charAt(0) + value.substring(index); } editText.setText(newValue); } String str = editText.getText().toString().replaceAll(thousandSeparator, ""); if (!value.equals("")) { editText.setText(getDecimalFormattedString(str)); } editText.setSelection(editText.getText().toString().length()); } //setting the cursor back to where it was editText.setSelection(editText.getText().toString().length() - cursorPosition); editText.addTextChangedListener(this); } catch (Exception ex) { ex.printStackTrace(); editText.addTextChangedListener(this); } } private static String getDecimalFormattedString(String value) { String[] splitValue = value.split("\\."); String beforeDecimal = value; String afterDecimal = null; String finalResult = ""; if (splitValue.length == 2) { beforeDecimal = splitValue[0]; afterDecimal = splitValue[1]; } int count = 0; for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) { finalResult = beforeDecimal.charAt(i) + finalResult; count++; if (count == 3 && i > 0) { finalResult = thousandSeparator + finalResult; count = 0; } } if (afterDecimal != null) { finalResult = finalResult + decimalMarker + afterDecimal; } return finalResult; } /* * Returns the ssortingng after removing all the thousands separators. * */ public static Ssortingng getOriginalSsortingng(Ssortingng ssortingng) { return ssortingng.replace(thousandSeparator,""); } } 

Comme j’avais le même problème, j’ai décidé de trouver une solution

Trouvez ma fonction ci-dessous J’espère que cela aidera les gens à trouver une solution

 securityDeposit.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub if (s.toSsortingng().sortingm().length() > 0) { int rentValue = Integer.parseInt(s.toSsortingng() .replaceAll(",", "")); SsortingngBuffer rentVal = new SsortingngBuffer(); if (rentValue > 10000000) { s.clear(); s.append("10,000,000"); } else { if (s.length() == 4) { char x[] = s.toSsortingng().toCharArray(); char y[] = new char[x.length + 1]; for (int z = 0; z < y.length; z++) { if (z == 1) { y[1] = ','; } else { if (z == 0) y[z] = x[z]; else { y[z] = x[z - 1]; } } } for (int z = 0; z < y.length; z++) { rentVal = rentVal.append(y[z]); } s.clear(); s.append(rentVal); } } } } });