androidkotlincalculatorbackspace

I can't save a string value into StringBuilder variable on my calcaultor app


i been working on an calcaultor app i managed to finish all the buttons but the backspace button ain't working, everytime i try it basically it deletes the numbers from the textView and it doesn't save it true value for example if i hit 9 button 3 times which would give me "999" as a result and then i hit the backspace button it should be "99" and that what actually happens it applies to the textView only so if i try multiplying "99" to "1" after using my backspace which was "999" the result that actually was given is "999" which is wrong cuz "99" * "1" = "99"

My here is part of my mainActivity's code:

package com.example.newcal

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.TextUtils.substring
import android.view.View
import android.widget.Button
import android.widget.TextView
import java.lang.IllegalArgumentException
import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.absoluteValue


class MainActivity : AppCompatActivity() {
    private var strNumber = StringBuilder()
    private lateinit var tvDisplay: TextView
    private lateinit var button1: Button
    private lateinit var button2: Button
    private lateinit var button3: Button
    private lateinit var button4: Button
    private lateinit var button5: Button
    private lateinit var button6: Button
    private lateinit var button7: Button
    private lateinit var button8: Button
    private lateinit var button9: Button
    private lateinit var buttonClear: Button
    private lateinit var buttonDot: Button
    private lateinit var buttonZero: Button
    private lateinit var buttonDivide: Button
    private lateinit var buttonMultiply: Button
    private lateinit var buttonSubtract: Button
    private lateinit var buttonAdd: Button
    private lateinit var buttonEquals: Button
    private lateinit var buttonBack: Button
    private lateinit var operatorButtons: List<Button>
    private lateinit var numbButtons: Array<Button>
    private var operator: Operator = Operator.NONE
    private var isOperatorClicked: Boolean = false
    private var no1: Double = 0.0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        components()

        strNumber.append(0.0)
        tvDisplay.text = strNumber
        isOperatorClicked = true

        for (i in operatorButtons){i.setOnClickListener { operatorButtonClicked(i) }}
        for (i in numbButtons){i.setOnClickListener { numbButtonsClicked(i) }}
        buttonEquals.setOnClickListener { buttonEqualsClicked() }
        buttonClear.setOnClickListener { btnClickedClear() }
        buttonBack.setOnClickListener { btnClickedBack() }

    }

private fun buttonEqualsClicked() {
        val no2 = strNumber.toString().toDouble()
        val result: Double
            if (isOperatorClicked == false){
                when(operator){
                    Operator.ADD -> result = no1 + no2
                    Operator.SUB -> result = no1 - no2
                    Operator.DIV -> result = no1 / no2
                    Operator.MUL -> result = no1 * no2
                    Operator.NONE -> result = 0.0
                }
                strNumber.clear()
                strNumber.append(result.toString())
                tvDisplay.text = strNumber
                isOperatorClicked = true
            }

        }

 private fun btnClickedBack() {
        var str = tvDisplay.text.toString()
        if (str.length > 1) {
            str = str.substring(0, str.length - 1)
            tvDisplay.text = str

            }
        if (str.length <= 1){
            val st = strNumber.append(btnClickedClear().substring(0, strNumber.length -3))
            tvDisplay.text = st
        }

    }

enum class Operator{ADD, SUB, DIV, MUL, NONE}

and here is some screenshots for a better view

https://i.sstatic.net/lP5va.jpg


Solution

  • In my opinion, you have not to use StringBuilder. Instead, you can use String variable you will modify directly.

    If you're sure that you will stay use StringBuilder, you must remove last char in StringBuilder as below.

     private fun btnClickedBack() {
        if(strNumber.length() > 0){
           strNumber.deleteCharAt(sb.length() - 1)
           tvDisplay.text = strNumber
        }
    }