How to Automatically Add Thousand Separators as Number Is Input in Edittext

How to Automatically add thousand separators as number is input in EditText

You can use String.format() in a TextWatcher. The comma in the format specifier does the trick.

This does not work for floating point input. And be careful not to set an infinite loop with the TextWatcher.

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

Add Thousand Separators Automatically While Text Changes in Android EditText

I was having the same issue and researched much for the task To get the proper result. So I finally solved the issueand I am providing you my code that'll definitely help you out.

You can directly copy my codes in your own class, It's fully Tested

Fetures of the following codes

  • Puts thousand separator as text changes inside EditText.

  • adds 0. Automatically when pressed period (.) At First.

  • Ignores 0 input at Beginning.

Class Name : NumberTextWatcherForThousand which implements TextWatcher

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import java.util.StringTokenizer;

/**
* Created by Shreekrishna on 12/14/2014.
*/
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);
String value = editText.getText().toString();

if (value != null && !value.equals(""))
{

if(value.startsWith(".")){
editText.setText("0.");
}
if(value.startsWith("0") && !value.startsWith("0.")){
editText.setText("");

}

String str = editText.getText().toString().replaceAll(",", "");
if (!value.equals(""))
editText.setText(getDecimalFormattedString(str));
editText.setSelection(editText.getText().toString().length());
}
editText.addTextChangedListener(this);
return;
}
catch (Exception ex)
{
ex.printStackTrace();
editText.addTextChangedListener(this);
}

}

public static String getDecimalFormattedString(String value)
{
StringTokenizer lst = new StringTokenizer(value, ".");
String str1 = value;
String str2 = "";
if (lst.countTokens() > 1)
{
str1 = lst.nextToken();
str2 = lst.nextToken();
}
String 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 String trimCommaOfString(String string) {
// String returnString;
if(string.contains(",")){
return string.replace(",","");}
else {
return string;
}

}
}

Use This Class on your EditText as follows

editText.addTextChangedListener(new NumberTextWatcherForThousand(editText));

To get the input as plain Text Typed as Double

Use the trimCommaOfString method of the same class like this

NumberTextWatcherForThousand.trimCommaOfString(editText.getText().toString());

Adding automatically thousand separators as number input doesn't work

You removed the textChangedListener before setting text in afterTextChanged, but didn't add it afterwards.

if (!(etEdit.getText().toString().equals(""))) {
etEdit.removeTextChangedListener(this);
etEdit.setText(thousandSeparators(Double.valueOf(etEdit.getText().toString().replace(String.valueOf((char) 160), "").trim())));
etEdit.addTextChangedListener(this);
}

P.S - You should also remove and add the listener before setting text in the matcher if condition block (to prevent it from getting into an infinite loop).

  etEdit.removeTextChangedListener(this);
etEdit.setText(etEdit.getText().subSequence(0, etEdit.getText().length() - 1));
etEdit.addTextChangedListener(this);

Decimal separator comma (',') with numberDecimal inputType in EditText

A workaround (until Google fix this bug) is to use an EditText with android:inputType="numberDecimal" and android:digits="0123456789.,".

Then add a TextChangedListener to the EditText with the following 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
}

Display number in Textview with thousand separator and decimal format

This did the trick:

DecimalFormat decim = new DecimalFormat("#,###.##");
tv.setText(decim.format(someFloat));


Related Topics



Leave a reply



Submit