J'ai besoin de formater la devise d'entrée avec le format 2 décimal Exemple lorsque l'utilisateur saisit 2, il semble 2,00 $, puis lorsque l'utilisateur saisit 2, le convertir en 22,00 $, etc.
Je m'approche de quelque chose de similaire, lorsque l'utilisateur saisit 2, il convertit en 0,02 $ ensuite 2 sera comme ceci 0,22 $
tout le monde peut m'aider merci
public class MoneyTextWatcher implements TextWatcher {
private final WeakReference<EditText> editTextWeakReference;
public MoneyTextWatcher(EditText mEditText) {
editTextWeakReference = new WeakReference<EditText>(mEditText);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
EditText editTex = editTextWeakReference.get();
if(!s.toString().equals(editTex.getText())) {
editTex.removeTextChangedListener(this);
String cleanString = s.toString().replaceAll("[$,.]", "");
double parsed = Double.parseDouble(cleanString.replaceAll("[^\\d]", ""));
String formatted = NumberFormat.getCurrencyInstance().format((parsed / 100));
editTex.setText(formatted);
editTex.setSelection(formatted.length());
editTex.addTextChangedListener(this);
}
@Override
public void afterTextChanged(Editable s) {
}
}
}
Je pense que vous pouvez essayer ce qui suit:
Disposition:
<EditText
Android:id="@+id/editText"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:inputType="numberDecimal"
/>
Activité:
EditText editText = (EditText) findViewById(R.id.editText);
editText.addTextChangedListener(new NumberTextWatcher(editText, "#,###"));
avec l'observateur de texte comme suit:
public class NumberTextWatcher implements TextWatcher {
private final DecimalFormat df;
private final DecimalFormat dfnd;
private final EditText et;
private boolean hasFractionalPart;
private int trailingZeroCount;
public NumberTextWatcher(EditText editText, String pattern) {
df = new DecimalFormat(pattern);
df.setDecimalSeparatorAlwaysShown(true);
dfnd = new DecimalFormat("#,###.00");
this.et = editText;
hasFractionalPart = false;
}
@Override
public void afterTextChanged(Editable s) {
et.removeTextChangedListener(this);
if (s != null && !s.toString().isEmpty()) {
try {
int inilen, endlen;
inilen = et.getText().length();
String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), "").replace("$","");
Number n = df.parse(v);
int cp = et.getSelectionStart();
if (hasFractionalPart) {
StringBuilder trailingZeros = new StringBuilder();
while (trailingZeroCount-- > 0)
trailingZeros.append('0');
et.setText(df.format(n) + trailingZeros.toString());
} else {
et.setText(dfnd.format(n));
}
et.setText("$".concat(et.getText().toString()));
endlen = et.getText().length();
int sel = (cp + (endlen - inilen));
if (sel > 0 && sel < et.getText().length()) {
et.setSelection(sel);
} else if (trailingZeroCount > -1) {
et.setSelection(et.getText().length() - 3);
} else {
et.setSelection(et.getText().length());
}
} catch (NumberFormatException | ParseException e) {
e.printStackTrace();
}
}
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) {
int index = s.toString().indexOf(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator()));
trailingZeroCount = 0;
if (index > -1) {
for (index++; index < s.length(); index++) {
if (s.charAt(index) == '0')
trailingZeroCount++;
else {
trailingZeroCount = 0;
}
}
hasFractionalPart = true;
} else {
hasFractionalPart = false;
}
}
}
Conservez le numéro saisi par l'utilisateur séparément, car si vous utilisez votre edittext.text, vous aurez plus de problèmes.
Ensuite, utilisez DecimalFormat pour le formater comme vous le souhaitez.
Pour le premier, c’est peut-être un bon moyen de restaurer l’entrée originale dans edittext dès que les utilisateurs commencent à éditer. Ainsi, vous éviterez les problèmes d’édition.
J'espère que cela t'aides.
Le code HI ci-dessous convertit chaque nombre en deux décimales. Doit être un nombre, des caractères et des caractères spéciaux pouvant provoquer une exception de numberformat. S'il vous plaît gérer cela comme vous aviez besoin Merci
public static String formatDecimal(String value) {
DecimalFormat df = new DecimalFormat("#,###,##0.00");
return df.format(Double.valueOf(value));
}