Форматирование EditText в денежный формат
Стиль EditText
<style name="MyEditStyle">
<item name="android:maxLines">1</item>
<item name="android:textCursorDrawable">@null</item>
<item name="android:inputType">number</item>
<item name="android:lines">1</item>
</style>
Мне нужно показывать клавиатуру ввода цифр (только цифр) и при вводе автоматически форматировать вводимую строку в "денежный" формат.
Например ввел я
3000 автоматам стало 3 000
300 автоматам стало 300
30000 автоматам стало 30 000
Как это можно сделать?
Ответы (3 шт):
Автор решения: Barmaley
→ Ссылка
Не занимайтесь велосипедостроительством, возьмите готовую библиотеку, например эту:
<com.vicmikhailau.maskededittext.MaskedEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:mask="### ### ###" />
Автор решения: AVRamones
→ Ссылка
Создайте класс вроде такого
public class FormatManager {
public String formatPrice(int price) {
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat df = new DecimalFormat("###,###", symbols);
return df.format(price);
}
}
после завершения ввода текста в нужном месте:
FormatManager fm = new FormatManager();
String result = fm.formatPrice(editText.toString());
Автор решения: SKULL
→ Ссылка
Вот такое решение выбрал для себя
class MoneyTextWatcher(
private val editText: EditText,
var sep: String
) : TextWatcher {
private val formatter = NumberFormat.getInstance(Locale.US) as DecimalFormat
init {
formatter.applyPattern("#,###,###,###")
}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
try {
editText.removeTextChangedListener(this)
var origStr = s.toString()
origStr = origStr.replace(",".toRegex(), "").replace(" ".toRegex(), "")
val longValue = origStr.toLong()
var str = formatter.format(longValue)
if (str.contains(",")) {
str = str.replace(",".toRegex(), sep)
}
editText.setText(str)
editText.setSelection(editText.text.length)
} catch (nfe: NumberFormatException) {
nfe.printStackTrace()
} finally {
editText.addTextChangedListener(this)
}
}
}
Используется так
editText.addTextChangedListener(MoneyTextWatcher(editText, " "))