我正在 Android Kotlin 中执行此操作
val simpleInterest = ((num1*num2)*num3)/100
但它说 未解决的参考。由于接收器类型不匹配,以下候选者均不适用: 公共内联运算符 fun BigDecimal.times(other: BigDecimal): kotlin 中定义的 BigDecimal 公共内联运算符 fun BigInteger.times(other: BigInteger): kotlin 中定义的 BigInteger
实际上我的代码是:
fun onSimpleInterest(view: View) {
val str:String = txtDisplay.text.toString()
val sp = arrayOf(str.split("[*+\\-\\/]".toRegex(), 3))
val num1 = sp[0]
val num2 = sp[1]
val num3 = sp[2]
val simpleInterest = ((num1*num2)*num3)/100
buttonSI.setOnClickListener {
txtDisplay.text = simpleInterest
}
}
这里发生了几件事。
split
扩展函数返回一个列表。所以 sp
实际上是一个列表数组。
由于 sp 的类型是列表数组,因此对其进行索引(
val num1 = sp[0]
等)实际上返回列表,而不是字符串。所以 num1、num2 和 num3 实际上是 List<String>
。
您需要做的是去掉 arrayOf 并将 sp 设置为 str.split 的结果。 Sp 现在将是一个列表,因此您可以将 num1、num2 和 num3 设置为适当的索引,这将是字符串。
接下来,将这些字符串转换为整数,然后你就可以进行算术了。
最后,
simpleInterest
是一个Int,但我很确定txtDisplay
会期望一个CharSequence,所以将该Int转换回String。
解决方案:
fun onSimpleInterest(view: View) {
val str:String = txtDisplay.text.toString()
val sp = str.split("[*+\\-\\/]".toRegex(), 3)
val num1 = sp[0].toInt() // Possible Exceptions
val num2 = sp[1].toInt()
val num3 = sp[2].toInt()
val simpleInterest = ((num1*num2)*num3)/100
buttonSI.setOnClickListener {
txtDisplay.text = simpleInterest.toString()
}
}
注意:这里有很多实例可能会引发您未捕获和处理的异常。
如果用户输入的元素少于 3 个,则 split 返回的 List 的大小将小于 3。因此为其建立索引(
sp[1]
等)可能会返回 IndexOutOfBoundsException。
同样在同一行上,即使用户键入 3 个或更多元素,这些元素也可能不是整数。在这种情况下,尝试将它们转换为整数可能会返回 NumberFormatException。
您应该处理这些可能性。
浮点文字需要在数字后面加上 f。我在这一行遇到了同样的问题:
val speedKmph = ((location?.speed?: 0) * 3.6).roundToInt()
通过添加 f:
进行修复val speedKmph = ((location?.speed?: 0f) * 3.6).roundToInt()