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
Passing Argument to Dialogfragment
Sqlite Android Database Cursor Window Allocation of 2048 Kb Failed
Download Files and Store Them Locally with Phonegap/Jquery Mobile Android and iOS Apps
Opening Android Settings Programmatically
How to Customize Item Background and Item Text Color Inside Navigationview
Mediaplayer Stutters at Start of Mp3 Playback
Read & Writing Arrays of Parcelable Objects
How to Use Adb to Send Touch Events to Device Using Sendevent Command
Android Adb Devices Unauthorized
Retaining Position in Listview After Calling Notifydatasetchanged
How to Use Adb in Android Studio to View an SQLite Db
How to Set Custom Actionbar Color/Style
Move Markers in Google Map V2 Android
How to Check If an Intent Can Be Handled from Some Activity
How to Crop an Image in Android
Error:Failed to Open Zip File. Gradle's Dependency Cache May Be Corrupt