我正在尝试实现一个带有逗号和点的文本观察器,但我找不到解决方案。如果用户输入 10000,我需要在我的编辑文本中将其显示为 10.000,如果用户想要添加便士,则需要在逗号之后显示为 10.000,50,最多允许 2 位数字,这是我尝试做的事情。我怎样才能做到这一点?有人可以帮助我吗?
et_cekme_tutari.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {
et_cekme_tutari.removeTextChangedListener(this)
try {
var givenstring: String = p0.toString()
if (givenstring.contains(thousandSeparator)) {
givenstring = givenstring.replace(thousandSeparator.toString(), "")
}
val containsDotAndComma = givenstring.contains('.') && givenstring.contains(',')
if (containsDotAndComma) {
givenstring = givenstring.replace(".", "")
}
givenstring = givenstring.replace(",", ".")
val doubleVal: Double = givenstring.toDouble()
val unusualSymbols = DecimalFormatSymbols()
unusualSymbols.decimalSeparator = decimalSeparator
unusualSymbols.groupingSeparator = thousandSeparator
val formatter = DecimalFormat("#,##0.##", unusualSymbols)
formatter.groupingSize = 3
val formattedString = formatter.format(doubleVal)
et_cekme_tutari.setText(formattedString)
et_cekme_tutari.setSelection(et_cekme_tutari.text.length)
} catch (nfe: NumberFormatException) {
nfe.printStackTrace()
} catch (e: Exception) {
e.printStackTrace()
}
et_cekme_tutari.addTextChangedListener(this)
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
})
private var decimalSeparator: Char = ','
private var thousandSeparator: Char = '.'
fun setDecimalSeparator(decimalSeparator: Char) {
this.decimalSeparator = decimalSeparator
}
fun setThousandSeparator(thousandSeparator: Char) {
this.thousandSeparator = thousandSeparator
}
我会尝试这样的事情......
class NumberTextWatcher(private val editText: EditText) : TextWatcher {
private val decimalFormat: DecimalFormat
private var isEditing: Boolean = false
init {
val symbols = DecimalFormatSymbols(Locale.getDefault()).apply {
groupingSeparator = '.'
decimalSeparator = ','
}
decimalFormat = DecimalFormat("#,##0.##", symbols).apply {
isDecimalSeparatorAlwaysShown = false
isGroupingUsed = true
}
}
…
override fun afterTextChanged(ed: Editable?) {
if (isEditing || ed == null) return
isEditing = true
try {
val originalStr = ed.toString()
val cleanString = originalStr.replace(".", "").replace(",", "")
if (cleanString.isNotEmpty()) {
val parsed = cleanString.toDouble()
val formatted = decimalFormat.format(parsed / 100) // Assuming input needs to be divided by 100
ed.replace(0, ed.length, formatted)
// Attempt to maintain cursor position
editText.setSelection(minOf(formatted.length, editText.selectionStart))
}
} catch (e: NumberFormatException) {
ed.clear()
}
isEditing = false
}
}
甚至可以使用
BigDecimal
代替 Double
并调整 Locale
...