在Android中用千位分隔符(,)输入时如何格式化EditText的输入?
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;
}
}
}
To use it, add a TextChangedListener to the EditText component.
editText.addTextChangedListener(new NumberTextWatcher(editText));
将此添加到您应用的 Gradle
编译 'com.aldoapps:autoformatedittext:0.9.3'
在 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"/>
本库自动添加(,)(.)
DecimalFormat formatter = new DecimalFormat("#,###,###");
String yourFormattedString = formatter.format(100000);
使用小数格式
的 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) {}
}
我有一个 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;
}
}
}
To use it, add a TextChangedListener to the EditText component.
editText.addTextChangedListener(new NumberTextWatcher(editText));
将此添加到您应用的 Gradle 编译 'com.aldoapps:autoformatedittext:0.9.3' 在 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"/>
本库自动添加(,)(.)
DecimalFormat formatter = new DecimalFormat("#,###,###");
String yourFormattedString = formatter.format(100000);
使用小数格式
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) {}
}