【初心者がAndroid Studio+kotlinで電卓アプリを作ってみる】第7回:小数を扱う編

kotlinで電卓アプリ作成

電卓アプリを作ってみるシリーズ一覧はこちらをクリック

今回のポイント

小数を扱えるようにしていきます。
1/2=0.5
3/2=1.5
2/1=2を表示したい

変数をInt型からDouble型に変える

小数を扱えるように値を格納する変数をDouble型に変えていきます。
現在変数に0を代入しているので勝手にInt型(整数しか扱えない)になっていますので
それを0.0を代入すると勝手にDouble型(小数を扱える)になるらしい。
kotlinはこの変数はDoubleですよの宣言がいらないみたいですね。

変更前(Int型)

        // 値を格納する変数
        var valueForTempStorage = 0 // 一時保存用の値
        var valueForCalc1st = 0 // 計算用の値1番目
        var valueForCalc2nd = 0 // 計算用の値2番目
        var valueForResults = 0 // 結果用の値

変更後(Double型)

        // 値を格納する変数
        var valueForTempStorage = 0.0 // 一時保存用の値
        var valueForCalc1st = 0.0 // 計算用の値1番目
        var valueForCalc2nd = 0.0 // 計算用の値2番目
        var valueForResults = 0.0 // 結果用の値

すっごいエラー出ます。31個のエラーです。
変数がDoubleなのにIntが入ってきてるんですけどー!のエラーだと思いますので面倒ですがエラーが出ている31個の0を0.0に変えていきます。

31か所全て0を0.0に変更したらエラーが消えた。

試しに実行して1/2=をやってみましょう。
1を押すと1.0と表示されます。
÷ボタンを押して
2を押すと2.0が表示されます。
=ボタンを押すと0.5が表示されます。
うーん1が1.0で表示されるのはいやなのでTextViewに整数なら.0を自動で省略する設定ないかと思っていろいろとgoogleで調べまくった結果、見つけられず。
Excelなら設定でありますよね。
しょうがないので数値ボタン押下時の処理をいじりました。

1が1.0と表示されてしまう問題の解決方法

色々と試した結果、Int型なら小数点以下は切り捨てなのでDouble型をInt型として表示してしまえばいいいじゃないかという浅はかな考えしか思い浮かばなかったのでそれで行ってみます。

        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 1
            binding.textViewValuedisplay.text = valueForTempStorage.toString()
        }

上の処理”binding.textViewValuedisplay.text = valueForTempStorage.toString()”
textViewValuedisplayはString型なのでvalueForTempStorage(Int型でした今はDoubule型)を.toString()に変換して表示してねっていう処理ですよね。(多分)
ではvalueForTempStorage.toString()を.toIntして.toStringしまえばよくない?

        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 1
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }

迷走中ですがこんな感じになりました。

実行してみました。
1÷2=0.5よし!
3÷2=1.5よし!
2÷1=2.0ダメだっ!2.0じゃなくて2を表示にしたい。
では全てbinding.textViewValuedisplay.text = valueForTempStorage.toString()
をbinding.textViewValuedisplay.text = valueForTempStorage.toInt.toString()
に変えたらどうなるかというと
1÷2=0ダメだっ! .5切り捨てられる
3÷2=1ダメだっ! .5切り捨てられる
2÷1=2よし!
これはこまったので以下にしたいのようにしたいのですが小数で.0の場合をどうしましょう。
もう”.0″があったら”.0″を消せばいいじゃないかと思ったのでやってみる。

if (.0がある場合(2.0とか1.0)は){
    // 整数(Int型)で表示
    binding.textViewValuedisplay.text = valueForTempStorage.toInt.toString()
}
else (.0がない場合(0.5とか1.5)は){
    // 小数(Double型)で表示
    binding.textViewValuedisplay.text = valueForTempStorage.toString()
}

Int表示で.0を省略する

“.0″を探す方法

IndexOf関数なるものを発見!
どうやら文字を検索してその文字が文字列の何番目にあるか教えてくれるみたいです。
もし文字が無ければ-1を返してくれるらしいので使ってみます。
まずは文字を扱うのでString型の変数とBoolan型の変数を用意してみます。

        // 小数チェック用の変数
        var stringForPointZeroCheck = "" // .0チェック用の文字列
        var flagForDecimal = false // 小数チェック用のフラグ

次はbinding.buttonEqual.setOnClickListener(// =ボタンが押されたとき)まで移動して処理を追加してみます。

        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            valueForCalc2nd = valueForTempStorage
            valueForTempStorage = 0.0
            if (symbolForTempStorage == "+") {
                valueForResults = valueForCalc1st + valueForCalc2nd
            }
            else if (symbolForTempStorage == "-") {
                valueForResults = valueForCalc1st - valueForCalc2nd
            }
            else if (symbolForTempStorage == "*") {
                valueForResults = valueForCalc1st * valueForCalc2nd
            }
            else if (symbolForTempStorage == "/") {
                valueForResults = valueForCalc1st / valueForCalc2nd
            }
            stringForPointZeroCheck = valueForResults.toString()
            stringForPointZeroCheck = stringForPointZeroCheck.indexOf(".0").toString()
            if (stringForPointZeroCheck == "-1") { // .0がない(-1の)場合
                flagForDecimal = true
            }
            if (flagForDecimal) { // .0がなかった場合そのまま表示
                binding.textViewValuedisplay.text = valueForResults.toString()
            }
            else { // .0があった場合.toIntで小数を省略して表示
                binding.textViewValuedisplay.text = valueForResults.toInt().toString()
            }
            valueForCalc1st = valueForResults
            valueForCalc2nd = 0.0
            valueForResults = 0.0
            symbolForTempStorage = ""
            flagForDecimal = false
        }
        // ACボタンが押されたとき
        binding.buttonAllClear.setOnClickListener {
            valueForTempStorage = 0.0
            valueForCalc1st = 0.0
            valueForCalc2nd = 0.0
            valueForResults = 0.0
            flagForDecimal = false
            symbolForTempStorage = ""
            binding.textViewValuedisplay.text = ""
        }
    }
}

実行すると1÷2=0.5
2÷1=2と表示されました!
では+ボタンが押された場合、-ボタンが押された場合、×ボタン、÷ボタンにも同じ処理を追加していきます。(2÷1+を押したとき2.0が表示されてしまっているため)
コピペして実行
2÷1+で2が表示されたし2÷1×で2が表示されたので.0が表示されなくなりました。

今回のまとめ

こんな感じになりましたが長いので次回はついに関数を使って短く簡潔に出来たらいいなと思っています。

package com.example.calculatorapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.calculatorapplication.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        // 値を格納する変数
        var valueForTempStorage = 0.0 // 一時保存用の値
        var valueForCalc1st = 0.0 // 計算用の値1番目
        var valueForCalc2nd = 0.0 // 計算用の値2番目
        var valueForResults = 0.0 // 結果用の値
        // 記号を格納する変数
        var symbolForTempStorage = "" // 一時保存用の記号
        // 小数チェック用の変数
        var stringForPointZeroCheck = "" // .0チェック用の文字列
        var flagForDecimal = false // 小数チェック用のフラグ
        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 1
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 2ボタンが押された時
        binding.buttonTwo.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 2
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 3
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0.0
            }
            else if (valueForCalc2nd == 0.0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0.0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                stringForPointZeroCheck = valueForResults.toString()
                stringForPointZeroCheck = stringForPointZeroCheck.indexOf(".0").toString()
                if (stringForPointZeroCheck == "-1") {
                    flagForDecimal = true
                }
                if (flagForDecimal) {
                    binding.textViewValuedisplay.text = valueForResults.toString()
                }
                else {
                    binding.textViewValuedisplay.text = valueForResults.toInt().toString()
                }
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0.0
                valueForResults = 0.0
                flagForDecimal = false
            }
            symbolForTempStorage = "+"
        }
        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0.0
            }
            else if (valueForCalc2nd == 0.0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0.0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                stringForPointZeroCheck = valueForResults.toString()
                stringForPointZeroCheck = stringForPointZeroCheck.indexOf(".0").toString()
                if (stringForPointZeroCheck == "-1") {
                    flagForDecimal = true
                }
                if (flagForDecimal) {
                    binding.textViewValuedisplay.text = valueForResults.toString()
                }
                else {
                    binding.textViewValuedisplay.text = valueForResults.toInt().toString()
                }
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0.0
                valueForResults = 0.0
                flagForDecimal = false
            }
            symbolForTempStorage = "-"
        }
        // ×ボタンが押されたとき
        binding.buttonMultiplication.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0.0
            }
            else if (valueForCalc2nd == 0.0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0.0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                stringForPointZeroCheck = valueForResults.toString()
                stringForPointZeroCheck = stringForPointZeroCheck.indexOf(".0").toString()
                if (stringForPointZeroCheck == "-1") {
                    flagForDecimal = true
                }
                if (flagForDecimal) {
                    binding.textViewValuedisplay.text = valueForResults.toString()
                }
                else {
                    binding.textViewValuedisplay.text = valueForResults.toInt().toString()
                }
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0.0
                valueForResults = 0.0
                flagForDecimal = false
            }
            symbolForTempStorage = "*"
        }
        // ÷ボタンが押されたとき
        binding.buttonDivision.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0.0
            }
            else if (valueForCalc2nd == 0.0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0.0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                stringForPointZeroCheck = valueForResults.toString()
                stringForPointZeroCheck = stringForPointZeroCheck.indexOf(".0").toString()
                if (stringForPointZeroCheck == "-1") {
                    flagForDecimal = true
                }
                if (flagForDecimal) {
                    binding.textViewValuedisplay.text = valueForResults.toString()
                }
                else {
                    binding.textViewValuedisplay.text = valueForResults.toInt().toString()
                }
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0.0
                valueForResults = 0.0
                flagForDecimal = false
            }
            symbolForTempStorage = "/"
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            valueForCalc2nd = valueForTempStorage
            valueForTempStorage = 0.0
            if (symbolForTempStorage == "+") {
                valueForResults = valueForCalc1st + valueForCalc2nd
            }
            else if (symbolForTempStorage == "-") {
                valueForResults = valueForCalc1st - valueForCalc2nd
            }
            else if (symbolForTempStorage == "*") {
                valueForResults = valueForCalc1st * valueForCalc2nd
            }
            else if (symbolForTempStorage == "/") {
                valueForResults = valueForCalc1st / valueForCalc2nd
            }
            stringForPointZeroCheck = valueForResults.toString()
            stringForPointZeroCheck = stringForPointZeroCheck.indexOf(".0").toString()
            if (stringForPointZeroCheck == "-1") {
                flagForDecimal = true
            }
            if (flagForDecimal) {
                binding.textViewValuedisplay.text = valueForResults.toString()
            }
            else {
                binding.textViewValuedisplay.text = valueForResults.toInt().toString()
            }
            valueForCalc1st = valueForResults
            valueForCalc2nd = 0.0
            valueForResults = 0.0
            flagForDecimal = false
            symbolForTempStorage = ""
        }
        // ACボタンが押されたとき
        binding.buttonAllClear.setOnClickListener {
            valueForTempStorage = 0.0
            valueForCalc1st = 0.0
            valueForCalc2nd = 0.0
            valueForResults = 0.0
            flagForDecimal = false
            symbolForTempStorage = ""
            binding.textViewValuedisplay.text = ""
        }
    }
}

コメント