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

问题描述 投票:0回答:2

我正在 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

            }

        }
android kotlin expression bigdecimal operation
2个回答
2
投票

这里发生了几件事。

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。

您应该处理这些可能性。


0
投票

浮点文字需要在数字后面加上 f。我在这一行遇到了同样的问题:

val speedKmph = ((location?.speed?: 0) * 3.6).roundToInt()

通过添加 f:

进行修复
val speedKmph = ((location?.speed?: 0f) * 3.6).roundToInt()
© www.soinside.com 2019 - 2024. All rights reserved.