Сложение, вычитание, деление и умножение двух чисел. Kotlin - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь взять простой калькулятор в Java и преобразовать код в Kotlin в качестве примера, я никогда раньше не использовал Kotlin, и я потерян. Я пытаюсь взять число из editText и преобразовать его в число с плавающей точкой, чтобы сделать фактические преобразования, а затем выполнить операции над ними для результата

        var value1: Float? = null
        var value2: Float? = null
        var suma: Boolean = false
        var resta: Boolean = false
        var multi: Boolean = false
        var div: Boolean = false

        plus.setOnClickListener {
            if (expression == null) {
                expression.text = ""
            } else {
                value1 = expression.text.toString().toFloat()
                suma = true
                expression.text = ""
            }
        }

        mul.setOnClickListener {
            if (expression == null) {
                expression.text = ""
            } else {
                value1 = expression.text.toString().toFloat()
                multi = true
                expression.text = ""
            }
        }

        minus.setOnClickListener {
            if (expression == null) {
                expression.text = ""
            } else {
                value1 = expression.text.toString().toFloat()
                resta = true
                expression.text = ""
            }
        }

        divide.setOnClickListener {
            if (expression == null) {
                expression.text = ""
            } else {
                value1 = expression.text.toString().toFloat()
                div = true
                expression.text = ""
            }
        }

        dot.setOnClickListener {
            expression.text = expression.text.toString() + "."
        }

        clear.setOnClickListener {
            expression.text = ""
            value1 = null
            value2 = null
        }

        equal.setOnClickListener {
            value2 = expression.text.toString().toFloat()

            if (suma) {
                var s = value1 + value2
                expression.text = s.toString()
            }
            if (resta) {
                var r = value1 - value2
                expression.text = r.toString()
            }
            if (div) {
                var d = value1 / value2
                expression.text = d.toString()
            }
            if (multi) {
                var m = value1 * value2
                expression.text = m.toString()
            }
        }

Когда я пытаюсь сделать сложение, вычитая умножение или деление кода подчеркнуто красным после оператора и значения 2, также предлагается сделать это value1.plus(value2), но если я это сделаю, оно также будет красным и говорит only save or non-null asserted calls are allowed on a nullable reciever of type Float? Если я последую всем предложениям, дает мне это все еще не перестает быть подчеркнутым красным.

Вот так я начинаю значения

var value1: Float? = null
var value2: Float? = null

1 Ответ

3 голосов
/ 10 марта 2020

Не делайте ваши значения обнуляемыми. Это редко необходимо, чтобы иметь нулевые примитивные свойства. Ошибка, которую вы получаете, заключается в том, что вы пытаетесь использовать значения, которые могут быть нулевыми.

Создайте их как экземпляр.

var value1: Float = 0f
var value2: Float = 0f

И в вашем * Функция 1008 *, установите их обратно на 0f, а не null.

Если вам действительно нужно оставить их пустыми, вы можете сделать что-то вроде этого, добавив их только после проверки того, что они оба не NULL, а затем показать сообщение об ошибке, если любое из значений равно NULL:

if (suma) {
    val s = value1?.let { value2?.plus(it) }
    expression.text = s?.toString() ?: "Invalid input value(s)"
}
//...

Изменить в ответ на ваш комментарий:

Типичный калькулятор просто сбрасывает оператор, когда Вы нажимаете = перед чем-либо еще, поэтому я переписал бы слушатель равной кнопки следующим образом (с оператором when для простоты). Я удаляю свойство value2 member, потому что оно не нужно, и вместо этого использую локальное свойство.

equal.setOnClickListener {
    val value2 = expression.text.toString().toFloatOrNull()
    if (value2 != null) {
        val result = when {
            suma -> value1 + value2
            resta -> value1 - value2
            div -> value1 / value2
            multi -> value1 * value2
            else -> value1 // Shouldn't happen but can default to not changing number
        }
        expression.text = result.toString()
    }

    // reset for next operation
    suma = false
    resta = false
    div = false
    multi = false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...