前提・実現したいこと
足し算以外の計算の処理をさせたい。
参考にしたサイト
https://qiita.com/Hori-Masayuki/items/ee14a3964e53b4a8994d
AndroidStudioのJavaで電卓アプリを作成しています。
電卓の画面上に式を表示させることはできたのですが、肝心の「=」を押すと、掛け算も割り算も引き算も足し算になってしまいます。
エラーも出ていないため、どこを直せば動くようになるのかがわかりません。
計算を正しく実行させるにはどのようにすればよろしいでしょうか?
整数の足し算、引き算、掛け算、割り算のみの単純なアプリです。
発生している問題・エラーメッセージ
エラーメッセージ
なし
該当のソースコード
イコールのボタンを押した後に処理される部分です。
case R.id.equal: double tmp; double numResult = 0; //最終的な計算結果を取得する //まず文字列にして取得 String TextFormula = formula.getText().toString(); //数値がリストに入っていく List<String> nums = Arrays.asList(TextFormula.split("[\+\-×÷]", -1)); // 全て足し算の形に変換 size格納されている要素数 for (int i = 0; i < symbols.size(); i++) { switch (symbols.get(i)) { case "×": //numsのi番目とi+1番目をかけたものを代入する ex)8*9=0+72 //Double.parseDouble("変換したい文字列")引数で与えた文字列をdouble型に変換するメソッド tmp = Double.parseDouble(nums.get(i)) * Double.parseDouble(nums.get(i + 1)); //numsのi番目に0をセット nums.set(i, "0"); //numsのi+1番目にさっき計算したものを文字列に変換してセット nums.set(i + 1, String.valueOf(tmp)); break; case "÷": tmp = Double.parseDouble(nums.get(i)) / Double.parseDouble(nums.get(i + 1)); nums.set(i, "0"); nums.set(i + 1, String.valueOf(tmp)); break; case "−": nums.set(i + 1, String.valueOf(Double.parseDouble(nums.get(i + 1)) * -1)); break; } } //numsを一つ一つnumで受け取る for (String num : nums) { //numResult numResult += Double.parseDouble(num); } //テキストビューに出力 result.setText(String.valueOf(numResult)); break; } } }
Java ソースコード package com.example.calculator; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { TextView formula, result; List<String> symbols; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //これはonCreateの中に書く //数字ボタンを取得 findViewById(R.id.number0).setOnClickListener(this); findViewById(R.id.number1).setOnClickListener(this); findViewById(R.id.number2).setOnClickListener(this); findViewById(R.id.number3).setOnClickListener(this); findViewById(R.id.number4).setOnClickListener(this); findViewById(R.id.number5).setOnClickListener(this); findViewById(R.id.number6).setOnClickListener(this); findViewById(R.id.number7).setOnClickListener(this); findViewById(R.id.number8).setOnClickListener(this); findViewById(R.id.number9).setOnClickListener(this); //それ以外のボタンを取得 findViewById(R.id.divided).setOnClickListener(this); findViewById(R.id.times).setOnClickListener(this); findViewById(R.id.minus).setOnClickListener(this); findViewById(R.id.plus).setOnClickListener(this); findViewById(R.id.equal).setOnClickListener(this); findViewById(R.id.wasa).setOnClickListener(this); findViewById(R.id.clear).setOnClickListener(this); } @Override public void onClick(View v) { //電卓の処理 //メッセージを表示するtextViewオブジェクトを取得 TextView formula = findViewById(R.id.formula); TextView result = findViewById(R.id.result); //String型でArrayListを宣言 ArrayList<String> symbols = new ArrayList<String>(); //タップされた画面部品のidの値を取得 //idのR値に応じて処理を分岐 int id = v.getId(); //押されたボタンごとに処理を分岐 switch (id) { case R.id.number0: //途中式を取得して途中式に押されたものを追加 formula.setText(formula.getText().toString() + "0"); break; case R.id.number1: formula.setText(formula.getText().toString() + "1"); break; case R.id.number2: formula.setText(formula.getText().toString() + "2"); break; case R.id.number3: formula.setText(formula.getText().toString() + "3"); break; case R.id.number4: formula.setText(formula.getText().toString() + "4"); break; case R.id.number5: formula.setText(formula.getText().toString() + "5"); break; case R.id.number6: formula.setText(formula.getText().toString() + "6"); break; case R.id.number7: formula.setText(formula.getText().toString() + "7"); break; case R.id.number8: formula.setText(formula.getText().toString() + "8"); break; case R.id.number9: formula.setText(formula.getText().toString() + "9"); break; case R.id.plus: //足し算 formula.setText(formula.getText().toString() + "+"); //リストの最後に要素を追加 symbols.add("+"); break; case R.id.minus: //引き算 formula.setText(formula.getText().toString() + "−"); symbols.add("−"); break; case R.id.divided: //割り算 formula.setText(formula.getText().toString() + "÷"); symbols.add("÷"); break; case R.id.times: //掛け算 formula.setText(formula.getText().toString() + "×"); symbols.add("×"); break; case R.id.wasa: //+-を変更する case R.id.clear: //結果表示画面をクリアにする formula.setText(""); result.setText(""); symbols.clear(); break; case R.id.equal: double tmp; double numResult = 0; //最終的な計算結果を取得する //まず文字列にして取得 String TextFormula = formula.getText().toString(); //数値がリストに入っていく List<String> nums = Arrays.asList(TextFormula.split("[\+\-×÷]", -1)); //例外が起きそうなところをtryでかこむ try { /* //-5-5ができるようにする numsに設定されていた空白に0をセットしてあげる if ((nums.get(0).length() == 0) && (symbols.get(0) == "-")) { nums.set(0, "0"); }*/ // 全て足し算の形に変換 size格納されている要素数 for (int i = 0; i < symbols.size(); i++) { switch (symbols.get(i)) { case "×": //numsのi番目とi+1番目をかけたものを代入する ex)8*9=0+72 //Double.parseDouble("変換したい文字列")引数で与えた文字列をdouble型に変換するメソッド tmp = Double.parseDouble(nums.get(i)) * Double.parseDouble(nums.get(i + 1)); //numsのi番目に0をセット nums.set(i, "0"); //numsのi+1番目にさっき計算したものを文字列に変換してセット nums.set(i + 1, String.valueOf(tmp)); break; case "÷": tmp = Double.parseDouble(nums.get(i)) / Double.parseDouble(nums.get(i + 1)); nums.set(i, "0"); nums.set(i + 1, String.valueOf(tmp)); break; case "−": nums.set(i + 1, String.valueOf(Double.parseDouble(nums.get(i + 1)) * -1)); break; } } //numsを一つ一つnumで受け取る for (String num : nums) { //numResult numResult += Double.parseDouble(num); } //テキストビューに出力 result.setText(String.valueOf(numResult)); //tryの続き } catch (Exception e) { Log.e("エラー", e.getMessage()); } break; } } }
以上です。よろしくお願いいたします。 ### 試したこと カッコの位置の移動 処理を少なくして実行 再起動 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー