Android 以逗号作为小数分隔符的屏蔽EditText
我试图用十进制值显示EditText,但手机设置为英语时遇到问题。我需要这个EditText来使用逗号作为小数点分隔符,但是Android键盘没有将小数点分隔符本地化的功能。所以我使用下面的代码,但它不起作用Android 以逗号作为小数分隔符的屏蔽EditText,android,Android,我试图用十进制值显示EditText,但手机设置为英语时遇到问题。我需要这个EditText来使用逗号作为小数点分隔符,但是Android键盘没有将小数点分隔符本地化的功能。所以我使用下面的代码,但它不起作用 import java.text.DecimalFormat; import java.text.ParseException; import android.text.Editable; import android.text.TextWatcher; import android.w
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)
{
Locale locale = new Locale("pt", "BR");
df = (DecimalFormat) NumberFormat.getNumberInstance(locale);
DecimalFormatSymbols.getInstance().setDecimalSeparator(',');
DecimalFormatSymbols.getInstance().setGroupingSeparator('.');
// THE ERROR HAPPENS IN THE NEXT LINE
df.applyPattern("#.###,##");
df.setDecimalSeparatorAlwaysShown(true);
dfnd = (DecimalFormat) NumberFormat.getNumberInstance(locale);
dfnd.applyPattern("#.###");
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;
}
}
}
导入java.text.DecimalFormat;
导入java.text.ParseException;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.widget.EditText;
公共类NumberTextWatcher实现TextWatcher{
专用分码格式df;
私有决策格式dfnd;
私有布尔部分;
私人编辑;
公用号码ExtWatcher(编辑文本et)
{
语言环境=新语言环境(“pt”、“BR”);
df=(DecimalFormat)NumberFormat.getNumberInstance(locale);
DecimalFormatSymbols.getInstance().setDecimalSeparator(',');
DecimalFormatSymbols.getInstance().setGroupingSeparator('.');
//错误发生在下一行
df.applyPattern(“#.###,##,##”);
df.setDecimalSeparatorAlwaysShown(真);
dfnd=(DecimalFormat)NumberFormat.getNumberInstance(语言环境);
dfnd.applyPattern(“#.#####”);
this.et=et;
hasstatilpart=false;
}
@抑制警告(“未使用”)
私有静态最终字符串标记=“NumberTextWatcher”;
@凌驾
公共无效后文本已更改(可编辑)
{
et.removeTextChangedListener(此);
试一试{
内伊尼伦,恩德伦;
inilen=et.getText().length();
String v=s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()),“”);
数字n=df.parse(v);
int cp=et.getSelectionStart();
if(hasstatilpart){
et.setText(df.format(n));
}否则{
et.setText(dfnd.format(n));
}
endlen=et.getText().length();
int sel=(cp+(endlen-inilen));
if(sel>0&&sel问题使用下面的代码解决。它不是通用代码,但可能会帮助其他人
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class NumberTextWatcher implements TextWatcher {
private EditText mEditText;
public NumberTextWatcher(EditText editText) {
mEditText = editText;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void afterTextChanged(Editable editable) {
mEditText.removeTextChangedListener(this);
try {
int inilen, endlen;
inilen = mEditText.getText().length();
String v = editable.toString().replace(".", ",");
// Se começar com vírgula, acrescento o zero automaticamente
if (inilen == 1 && v.equals(",")) {
v = "0,";
}
// Se já tiver vírgula, não deixo inserir novamente
if (v.indexOf(",") != v.lastIndexOf(",")) {
if (v.lastIndexOf(",") == v.length() - 1) {
v = v.substring(0, v.length() - 1);
}
}
// Se já tiver vírgula, não deixo ficar com 3 dígitos na parte decimal
int separatorPosition = v.indexOf(",");
String decimalPart = v.substring(separatorPosition + 1);
if (decimalPart.length() > 2) {
v = v.substring(0, v.length() - 1);
}
int cp = mEditText.getSelectionStart();
mEditText.setText(v);
endlen = mEditText.getText().length();
int sel = (cp + (endlen - inilen));
if (sel > 0 && sel <= mEditText.getText().length()) {
mEditText.setSelection(sel);
} else {
if (mEditText.getText().length() > 0) {
// place cursor at the end?
mEditText.setSelection(mEditText.getText().length() - 1);
}
}
} catch (NumberFormatException nfe) {
// do nothing?
}
mEditText.addTextChangedListener(this);
}
}
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.widget.EditText;
公共类NumberTextWatcher实现TextWatcher{
私有EditText-mEditText;
公用号码ExtWatcher(EditText EditText){
mEditText=编辑文本;
}
@凌驾
更改前的公共无效(CharSequence CharSequence,int i,int i2,int i3){
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int i2,int i3){
}
@凌驾
public void PostTextChanged(可编辑){
mEditText.removeTextChangedListener(此);
试一试{
内伊尼伦,恩德伦;
inilen=mEditText.getText().length();
字符串v=editable.toString().replace(“.”,“,”);
//这是一个很好的例子,一个零自动的例子
如果(inilen==1&&v.equals(“,”)){
v=“0”;
}
//斯瓦蒂弗·维古拉,诺代克·迪克索·因塞里尔·诺瓦门特
如果(v.indexOf(“,”)=v.lastIndexOf(“,”)){
如果(v.lastIndexOf(“,”)==v.length()-1){
v=v.substring(0,v.length()-1);
}
}
//在瓦蒂弗·维古拉的著作中,第三部《十进位法》是一部十进位法
int separatorPosition=v.indexOf(“,”);
字符串小数部分=v.子字符串(分隔位置+1);
如果(小数部分长度()>2){
v=v.substring(0,v.length()-1);
}
int cp=mEditText.getSelectionStart();
mEditText.setText(v);
endlen=mEditText.getText().length();
int sel=(cp+(endlen-inilen));
如果(选择>0&&sel 0){
//将光标放在末尾?
mEditText.setSelection(mEditText.getText().length()-1);
}
}
}捕获(NumberFormatException nfe){
//什么也不做?
}
mEditText.addTextChangedListener(此);
}
}
请在此处发布相关内容,而不仅仅是链接。例如,您可能会包含预期输出。这将确保更多人的兴趣,您可能会很快得到更多答案
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class NumberTextWatcher implements TextWatcher {
private EditText mEditText;
public NumberTextWatcher(EditText editText) {
mEditText = editText;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void afterTextChanged(Editable editable) {
mEditText.removeTextChangedListener(this);
try {
int inilen, endlen;
inilen = mEditText.getText().length();
String v = editable.toString().replace(".", ",");
// Se começar com vírgula, acrescento o zero automaticamente
if (inilen == 1 && v.equals(",")) {
v = "0,";
}
// Se já tiver vírgula, não deixo inserir novamente
if (v.indexOf(",") != v.lastIndexOf(",")) {
if (v.lastIndexOf(",") == v.length() - 1) {
v = v.substring(0, v.length() - 1);
}
}
// Se já tiver vírgula, não deixo ficar com 3 dígitos na parte decimal
int separatorPosition = v.indexOf(",");
String decimalPart = v.substring(separatorPosition + 1);
if (decimalPart.length() > 2) {
v = v.substring(0, v.length() - 1);
}
int cp = mEditText.getSelectionStart();
mEditText.setText(v);
endlen = mEditText.getText().length();
int sel = (cp + (endlen - inilen));
if (sel > 0 && sel <= mEditText.getText().length()) {
mEditText.setSelection(sel);
} else {
if (mEditText.getText().length() > 0) {
// place cursor at the end?
mEditText.setSelection(mEditText.getText().length() - 1);
}
}
} catch (NumberFormatException nfe) {
// do nothing?
}
mEditText.addTextChangedListener(this);
}
}