解决Kotlin中BigDecimal的错误“无法解析的参考由于接收器类型不匹配,以下候选者均不适用”

问题描述

我正在Android Kotlin中进行

val simpleInterest = ((num1*num2)*num3)/100

但是它说 未解决的参考。由于接收器类型不匹配,以下候选者都不适用: 公共内联运算符fun BigDecimal.times(other:BigDecimal):在kotlin中定义的BigDecimal 公共内联运算符fun BigInteger.times(其他: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设置为适当的索引(即字符串)。

接下来,将这些字符串转换为Ints,然后就可以进行算术了。

最后,simpleInterest是一个Int,但是我很确定txtDisplay将期望使用CharSequence,因此请将Int转换回字符串。

解决方案

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个或更多元素,这些元素也可能不是整数。在这种情况下,尝试将它们转换为Ints可能会返回NumberFormatException。

您应该处理这些可能性。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...