Я пытаюсь отобразить EditText с десятичными значениями, однако у меня возникают проблемы с телефонами, установленными на английский язык. Мне нужен этот EditText, чтобы использовать запятую как разделитель десятичной дроби, но клавиатура Android не имеет возможности локализовать десятичный разделитель. Поэтому я использую следующий код, и он не работает.Masked EditText с запятой в качестве десятичного разделителя
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;
}
}
}
Вот исключение:
10-26 16:59:23.100 16231-16231/com.br.myapp.debug E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.br.myapp.debug, PID: 16231 java.lang.IllegalArgumentException: syntax error: DecimalFormat::applyPattern failed: U_UNEXPECTED_TOKEN: #.###,## at libcore.icu.NativeDecimalFormat.applyPattern(NativeDecimalFormat.java:490) at libcore.icu.NativeDecimalFormat.applyPattern(NativeDecimalFormat.java:278) at java.text.DecimalFormat.applyPattern(DecimalFormat.java:589) at com.br.myapp.util.NumberTextWatcher.(NumberTextWatcher.java:27) at com.br.myapp.fragments.PriceDialogFragment.onCreateDialog(PriceDialogFragment.java:73) at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:307) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5679) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) at dalvik.system.NativeStart.main(Native Method)
Пожалуйста, разместите здесь что-то актуальное вместо ссылки. Например, вы можете включить ожидаемые результаты. Это обеспечит интерес большего количества людей, и вы, скорее всего, получите больше ответов – Nabin