我在DecimalFormat
中使用TextWatcher
,这是我的代码:
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
但是当用户将零写入我的edittext时,df.format(n)
行结果将为 1 。
我该如何解决这个问题?
更新: 我调试了我的代码,如果我在编辑文本中编写7.0,我得到了这个:
text =&#34; 7.0&#34;
n = 7 (类型为数字)
如果我更改此行:
var n = df.parse(text)
到此:
var n = df.parse(text).toDouble()
n = 7.0
t =&#34; 7。&#34;
答案 0 :(得分:1)
您可以使用此代码转换为double
public static double Round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}
答案 1 :(得分:1)
尝试使用DecimalFormat(“#,###。00”)代替DecimalFormat(“#,###。##”)
答案 2 :(得分:0)
您好请检查以下代码的十进制格式
public static String roundTwoDecimalsString(double d) {
/*DecimalFormat twoDForm = new DecimalFormat("#.##");*/
DecimalFormat df = new DecimalFormat("#.##");
String formatted = df.format(d);
return formatted;
}