質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

1876閲覧

Vue.js 電卓作成の上で文字(演算子)を連続して入力しない方法

sss8127

総合スコア4

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/07/10 16:49

前提・実現したいこと

Vueで電卓作成をしています。
基本は
https://qiita.com/Naoto9282/items/4db4a854e151f310d517
を参考にしてますが色々変えながらやっています。

発生している問題・エラーメッセージ

上記を参考に以下のソースコードのように演算子を連続させないために色々if文を使って作成しようとしているのですが、+を入力した時はうまくいくのですがその他(-.*,/)を入力すると作動しません。
+を入力したあとに他の演算子を入力しても表示されないのでこの部分は作動していると思われます。
この部分に関するエラーメッセージは特に見当たりません...

該当のソースコード

HTML

1 <table id="app"> 2 <tr> 3 <td colspan="3" class="result"> 4 <input type="text" class="ip-result" id="total" v-model="total.toLocaleString()" readonly /> 5 </td> 6 <td><button value="C" v-on:click="calculationOpe('C')">C</button></td> 7 </tr> 8 <tr> 9 <td> 10 <button class="btn" v-on:click="calculationNum('7')">7</button> 11 </td> 12 <td> 13 <button class="btn" v-on:click="calculationNum('8')">8</button> 14 </td> 15 <td> 16 <button class="btn" v-on:click="calculationNum('9')">9</button> 17 </td> 18 <td> 19 <button class="btn" v-on:click="calculationOpe('/')">÷</button> 20 </td> 21 </tr> 22 <tr> 23 <td> 24 <button class="btn" v-on:click="calculationNum('4')">4</button> 25 </td> 26 <td> 27 <button class="btn" v-on:click="calculationNum('5')">5</button> 28 </td> 29 <td> 30 <button class="btn" v-on:click="calculationNum('6')">6</button> 31 </td> 32 <td> 33 <button class="btn" v-on:click="calculationOpe('*')">×</button> 34 </td> 35 </tr> 36 <tr> 37 <td> 38 <button class="btn" v-on:click="calculationNum('1')">1</button> 39 </td> 40 <td> 41 <button class="btn" v-on:click="calculationNum('2')">2</button> 42 </td> 43 <td> 44 <button class="btn" v-on:click="calculationNum('3')">3</button> 45 </td> 46 <td> 47 <button class="btn" v-on:click="calculationOpe('-')">-</button> 48 </td> 49 </tr> 50 <tr> 51 <td> 52 <button class="btn" v-on:click="calculationNum('0')">0</button> 53 </td> 54 <td> 55 <button class="btn" v-on:click="calculationNum('.')">.</button> 56 </td> 57 <td> 58 <button class="btn" v-on:click="calculationOpe('+')">+</button> 59 </td> 60 <td> 61 <button class="btn" v-on:click="calculationOpe('=')">=</button> 62 </td> 63 </tr> 64 </table>

JavaScript

1calculationOpe: function (num) { // 演算子を押したとき 2 if (num === '=') { // =を押したとき 3 this.total = Function('"use strict";return(' + this.total + ')')(); 4 } else if (num === 'C') { // Cを押したとき 5 this.total = ''; 6 } 7 else if (num === '+') { // +を押したとき 8 var pl = this.total.slice(-1); //計算式中の最後の文字を取得 9 if (pl.includes('+','-','*','/')) { //最後の文字が+,-,*,/のとき 10 num = ''; //+の入力を無効 11 } else { //最後の文字が+じゃないとき 12 this.total += num; //そのまま入力 13 } 14 } 15 else if (num === '-') { // -を押したとき 16 var mi = this.total.slice(-1); //計算式中の最後の文字を取得 17 if (mi.includes('+','-','*','/')) { //最後の文字が+,-,*,/のとき 18 num = ''; //-の入力を無効 19 } else { //最後の文字が-じゃないとき 20 this.total += num; //そのまま入力 21 } 22 } 23 else if (num === '*') { // *を押したとき 24 var mu = this.total.slice(-1); //計算式中の最後の文字を取得 25 if (mu.includes('+','-','*','/')) { //最後の文字が+,-,*,/のとき 26 num = ''; //*の入力を無効 27 } else { //最後の文字が*じゃないとき 28 this.total += num; //そのまま入力 29 } 30 } 31 else if (num === '/') { // /を押したとき 32 var de = this.total.slice(-1); //計算式中の最後の文字を取得 33 if (de.includes('+','-','*','/')) { //最後の文字が+,-,*,/のとき 34 num = ''; ///の入力を無効 35 } else { //最後の文字が/じゃないとき 36 this.total += num; //そのまま入力 37 } 38 } 39},

試したこと

+では作動するということは同一の関数内に演算に関する記述してはいけないのかと思い演算ごと(+,-,*,/)で関数を作成し直してみましたが変わらず。言語化してみて変な部分が無いかチェックしたのですが現時点での私からすると特に変なところは見当たらず...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

String.prototype.includes()はsearchString(検索文字列)を1つしか受け入れません。

'+'の分岐では'+'が1つ目の引数なので正しく動作してしまいますが、'-'以降の分岐では'+'しか判定されないので動作しません。

正規表現を使うか【JS】includes()で特定要素を複数指定したいときなどを参考にして独自関数を作ってください。


同じ様な判定部分を4回(+,-,*,/)重複して記述するのはミスにつながるので、関数にまとめたほうが良いと思います。

投稿2021/07/10 18:26

編集2021/07/10 18:29
k4a

総合スコア983

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sss8127

2021/07/10 18:55

ご回答ありがとうございます。 includes()は一つしか要素を指定できないみたいですね。 さらに演算子ごとに条件分けしたら解決しました!
guest

0

省略しますが以下のようにさらに条件分岐すると上記問題は解決しました。
ただ記述が長いので関数化してまとめていったりしようと思います。

JavaScript

1else if (num === "+") { 2 // 前の文字が演算子のとき無効 3 var pl = this.total.slice(-1); 4 if (pl.includes("+")) { 5 num = ""; 6 } else if (pl.includes("-")) { 7 num = ""; 8 } else if (pl.includes("*")) { 9 num = ""; 10 } else if (pl.includes("/")) { 11 num = ""; 12 } else { 13 this.total += num; 14 } 15}

投稿2021/07/10 19:13

sss8127

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問