【发布时间】:2017-09-07 06:18:17
【问题描述】:
我在TextWatcher 中使用DecimalFormat,这是我的代码:
override fun afterTextChanged(p0: Editable?) {
amountEt?.removeTextChangedListener(this)
var df = DecimalFormat("#,###.##")
df.maximumFractionDigits = 2
df.minimumFractionDigits = 0
if (hasFractionalPart) {
df.isDecimalSeparatorAlwaysShown = true
}
try {
val inilen: Int
val endlen: Int
inilen = amountEt?.text!!.length
var text: String? = p0.toString().replace(df.decimalFormatSymbols.groupingSeparator.toString(), "")
//text = text?.replace(df.decimalFormatSymbols.decimalSeparator.toString(), "")
var n = df.parse(text)
var t = df.format(n)
val cp = amountEt?.selectionStart
amountEt?.setText(t)
endlen = amountEt?.text!!.length
val sel = cp!!.plus(endlen - inilen)
if (sel > 0 && sel <= amountEt?.text!!.length) {
amountEt?.setSelection(sel)
} else {
// place cursor at the end?
amountEt?.setSelection(amountEt?.text!!.length - 1)
}
} catch (e: Exception) {
Log.d("ERROR", e.stackTrace.toString())
}
amountEt?.addTextChangedListener(this)
}
我的问题是用户想写入amountEt(这是一个EditText),例如:1.02
但是当用户将 zero 写入我的编辑文本时,df.format(n) 行结果将是 1。
我该如何解决这个问题?
更新: 我调试了我的代码,如果我将 7.0 写入编辑文本,我得到了这个:
text = "7.0"
n = 7(类型为数字)
如果我改变这一行:
var n = df.parse(text)
到这里:
var n = df.parse(text).toDouble()
n = 7.0
t = "7."
【问题讨论】:
-
您可以尝试以下操作吗:
with(DecimalFormat.getInstance(Locale.US)) { maximumFractionDigits = 2; minimumFractionDigits = 0; val n = parse("7.12"); println(n); println(format(n)); }它为我打印“7.12, 7.12”。所以唯一的区别是DecimalFormat是如何创建的。我不确定你是否真的需要这种模式? -
我试过你的代码,它写了 7.12,我改变了你的代码以使用我的文本变量,但是当我输入编辑文本“7”时它只写了 7。
-
设置
minimumFractionDigits = 1
标签: java android kotlin decimalformat