[英]How to format the input of EditText when typing with thousands separators (,) in Android?
我有一個edittext
,它只獲取沒有十進制數字的數字。
android:inputType="number"
我想在打字時分開數千個。 例如 25,000。
我知道我應該使用TextWatcher
並且我已經使用了這段代碼,但我無法讓它工作:
@Override
public void afterTextChanged(Editable viewss) {
String s = null;
try {
// The comma in the format specifier does the trick
s = String.format("%,d", Long.parseLong(viewss.toString()));
} catch (NumberFormatException e) {
}
}
你能幫我這樣做嗎?
測試這個例子:
import java.text.DecimalFormat;
import java.text.ParseException;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class NumberTextWatcher implements TextWatcher {
private DecimalFormat df;
private DecimalFormat dfnd;
private boolean hasFractionalPart;
private EditText et;
public NumberTextWatcher(EditText et)
{
df = new DecimalFormat("#,###.##");
df.setDecimalSeparatorAlwaysShown(true);
dfnd = new DecimalFormat("#,###");
this.et = et;
hasFractionalPart = false;
}
@SuppressWarnings("unused")
private static final String TAG = "NumberTextWatcher";
@Override
public void afterTextChanged(Editable s)
{
et.removeTextChangedListener(this);
try {
int inilen, endlen;
inilen = et.getText().length();
String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), "");
Number n = df.parse(v);
int cp = et.getSelectionStart();
if (hasFractionalPart) {
et.setText(df.format(n));
} else {
et.setText(dfnd.format(n));
}
endlen = et.getText().length();
int sel = (cp + (endlen - inilen));
if (sel > 0 && sel <= et.getText().length()) {
et.setSelection(sel);
} else {
// place cursor at the end?
et.setSelection(et.getText().length() - 1);
}
} catch (NumberFormatException nfe) {
// do nothing?
} catch (ParseException e) {
// do nothing?
}
et.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (s.toString().contains(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator())))
{
hasFractionalPart = true;
} else {
hasFractionalPart = false;
}
}
}
要使用它,請將 TextChangedListener 添加到 EditText 組件。
editText.addTextChangedListener(new NumberTextWatcher(editText));
將此添加到您的應用程序的 Gradle compile 'com.aldoapps:autoformatedittext:0.9.3' in XML xmlns:app="http://schemas.android.com/apk/res-auto"
<com.aldoapps.autoformatedittext.AutoFormatEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:isDecimal="true"
android:maxLength="8"
android:id="@+id/number"/>
這個lib自動加(,)(.)
DecimalFormat formatter = new DecimalFormat("#,###,###");
String yourFormattedString = formatter.format(100000);
使用十進制格式
Adrian Cid Almageur 評論的Kotlin 版本
import android.text.Editable
import android.text.TextWatcher
import android.widget.EditText
import java.text.DecimalFormat
import java.text.ParseException
class NumberTextWatcher(private val editText: EditText) : TextWatcher {
private val decimalFormat = DecimalFormat("#,###.##")
private val decimalFormatNoFrac = DecimalFormat("#,###")
private var hasFractionalPart = false
init {
decimalFormat.isDecimalSeparatorAlwaysShown = true
}
override fun afterTextChanged(s: Editable?) {
editText.removeTextChangedListener(this)
try {
val initialLength = editText.text.length
val v = s.toString()
.replace(decimalFormat.decimalFormatSymbols.groupingSeparator.toString(), "")
val number = decimalFormat.parse(v)
val cp = editText.selectionStart
if (hasFractionalPart) {
editText.setText(decimalFormat.format(number))
} else {
editText.setText(decimalFormatNoFrac.format(number))
}
val endLength = editText.length()
val selection = (cp + (endLength - initialLength))
if (selection > 0 && selection <= editText.text.length) {
editText.setSelection(selection)
} else {
editText.setSelection(editText.text.length - 1)
}
} catch (nfe: NumberFormatException) {
} catch (ex: ParseException) {
}
editText.addTextChangedListener(this)
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
hasFractionalPart =
s.toString().contains(decimalFormat.decimalFormatSymbols.decimalSeparator)
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.