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

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

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1814閲覧

jQueryを使っての自動計算で、文字列同士の足し算を解決したい

tennis

総合スコア19

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/01/19 00:29

編集2020/01/19 01:05

jQueryを利用しての自動計算での質問があります。

HTML

1<div class="fare"> 2 <input type="number" name="fare" placeholder="交通費を入力してください    (円)" id="travelCost1" class='txtCal'><br> 3</div> 4 5<div class="hotelName"> 6 <input type="text" name="hotelName" placeholder="ホテル名を入力してください" id="travelCost2" class='txtCal'><br> 7</div> 8 9<div class="hotelFee"> 10 <input type="number" name="hotelFee" placeholder="ホテル代を入力してください  (円)" id="travelCost3" class='txtCal'><br> 11</div> 12 13<div class="mealFee"> 14 <input type="number" name="mealFee" placeholder="食事代を入力してください   (円)" id="travelCost4" class='txtCal'><br> 15</div> 16 17<div class="otherAmount"> 18 <input type="number" name="otherAmount" placeholder="その他費用を入力してください (円)" id="travelCost5" class='txtCal'><br> 19</div> 20 21<div class="totalFee"> 22 <input type="hidden" name="totalFee"> 合計金額 : <span id="travelCost6" class="total_sum_value"></span>円<br> 23</div>

jQuery

1<script> 2$(function() { 3 calc_price(); 4 $("#travelCost1").change(function(){ 5 calc_price(); 6 }); 7 $("#travelCost3").change(function(){ 8 calc_price(); 9 }); 10 $("#travelCost4").change(function(){ 11 calc_price(); 12 }); 13 $("#travelCost5").change(function(){ 14 calc_price(); 15 }); 16 17 function calc_price(){ 18 var t1 = parseInt($("#travelCost1").val()); 19 var t3 = parseInt($("#travelCost3").val()); 20 var t4 = parseInt($("#travelCost4").val()); 21 var t5 = parseInt($("#travelCost5").val()); 22 var total = t1 + t3 + t4 + t5; 23 $("#travelCost6").text(total.toLocaleString()); 24 }; 25}); 26</script>

このような形で書いたのですが、入力したものが文字列として認識され、
文字列同士の足し算になってしまいます。
解決策をお願いいたします。

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

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

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

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

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

kei344

2020/01/19 03:29

回答が付いた質問の編集は慎重に行ってください。質問文のコードについて回答にて指摘があった場合は「追記」し、元のコードを編集する場合も「直したこと」がわかるようにしてください。後から見た人から見て、現在回答されておられる方の回答が「無いコードに対しての指摘」になり、意味がわからなくなります。
tennis

2020/01/19 04:03

わかりました。ご指摘ありがとうございます。
guest

回答3

0

ベストアンサー

こんにちは

以下は、ご質問に挙げられているHTMLとJSをそのままCodePenに転記したものです。

上記では、4つの <input type="number"> のいずれも数字が入力されていれば、合計金額が表示されますが、初期表示含めひとつでも空欄があるときは、合計金額に NaN と表示されてしまいます。これを、取り急ぎの応急措置で修正するには、以下のように || 0 を追加することが考えられます。 こうすると、parseInt した結果が NaN になったt1t4に整数値の 0 が入るようになります。

javascript

1var t1 = parseInt($("#travelCost1").val()) || 0; 2var t3 = parseInt($("#travelCost3").val()) || 0; 3var t4 = parseInt($("#travelCost4").val()) || 0; 4var t5 = parseInt($("#travelCost5").val()) || 0;

以下は、上記の修正を動作確認するものです。

最後にリファクタ案を挙げておきます。

javascript

1$(function() { 2 calc_price(); 3 $("input[type=number]").change(calc_price); 4 5 function calc_price(){ 6 var total = [...$("input[type=number]")].reduce((sum, input) => sum + (+input.value), 0); 7 $("#travelCost6").text(total.toLocaleString()); 8 }; 9}); 10

上記は以下の諸点で、ご質問にあるコードをリファクタしたものです。

  • changeハンドラを設定するところで、対象のセレクタを input[type=number] に修正して1行で済むようにした。
  • 合計の算出時に、 $("input[type=number]")スプレッド構文で配列にした後、reduceを使用
  • 合計を算出時に、数字の文字列を数値に変換する際、単項加算(unary plus)を使用

以上、参考になれば幸いです。

投稿2020/01/19 03:36

編集2020/01/19 03:59
jun68ykt

総合スコア9058

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

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

tennis

2020/01/19 04:03

できました!ありがとうございます!!
jun68ykt

2020/01/19 04:04

どういたしまして。 > できました! とのことで、よかったです????
tennis

2020/01/19 04:08

すいません、このこととは全く関係ないのですが、一番最後に出した合計金額をinput type="hidden" name="totalFee"で飛ばし、DBに登録したいのですが、nullになってしまって…この書き方だと飛ばないんですかね?
jun68ykt

2020/01/19 04:15

> ・・・で飛ばし、 ということだと、合計金額の算出後に、total を span#travelCost6 に text() で表示用に設定するだけではなく、以下のようにして、フォーム項目への反映も必要ですね。 $('input[name=totalFee]').val(total);
tennis

2020/01/19 04:18

すごい!できました!本当にありがとうございます!
guest

0

parseInt() を使わずに、Number() を使うか、0で減算するといけるかな?

JavaScript

1var t1 = Number($("#travelCost1").val());

JavaScript

1var t1 = $("#travelCost1").val() - 0;

投稿2020/01/19 02:31

reineko1

総合スコア9

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

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

tennis

2020/01/19 04:04

Numberのパターンと−0のパターン、試してみたのですが動きませんでした・・・でも勉強になりました!ありがとうございます!
guest

0

プログラムは基本的に一番内側から処理が行われますので、
文字列を結合した結果をパースしても意味はありません。
先に個々にパースしてから足し算しましょう。

投稿2020/01/19 00:39

m.ts10806

総合スコア80854

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

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

tennis

2020/01/19 00:44

ありがとうございます。個々にパースもしてみたのですが、その場合Nanとなってしまいます。
m.ts10806

2020/01/19 00:44

コード提示されないとなんとも。
m.ts10806

2020/01/19 00:45

あぁ質問のコード変更されたんですね。 回答によってかえられたのならその旨書かれないと・・・
m.ts10806

2020/01/19 00:49 編集

ちなみに空文字などはNaNになります。 console.log(parseInt("")); https://paiza.io/projects/flzA9TFRr8Ed8Rl45hTRkQ NaNに何を足し込んでもNaNなのでそうなるのではと。 今の作りだと全てに数値とみなせるものが入力されてないとNaNになると思います。
m.ts10806

2020/01/19 00:49

個々に同じ処理をするchangeイベント付与されると若干コード的には冗長になるので、 input['type=number']でまとめたほうが良いかなとも思います。
tennis

2020/01/19 00:54

全てに数値を入力したらNaNじゃなくなりました!ありがとうございます! ただ実現したいこととしては、travelCost1,3,4,5にそれぞれ値が入った時点で 合計金額を出したいのですが、その場合はどういった作りにすればいいのでしょうか。 初心者ですみません、input['type=number']はどこにどのように書けばいいのでしょうか。
m.ts10806

2020/01/19 01:00 編集

> travelCost1,3,4,5にそれぞれ値が入った時点で 合計金額を出したいのですが、その場合はどういった作りにすればいいのでしょうか。 一気に足し込むのではなく初期値0の変数から個々に足し込んでいき、空の場合は足し込まないようにすると良いと思います。 >input['type=number'] これもセレクタなので現在と概念は同じです。 https://qiita.com/Thought_Nibbler/items/5d4fc40a4d4325128b24 あと今気づいたんですが、 JavaとJavaScriptは別物なので、タグは修正しておいてください。
退会済みユーザー

退会済みユーザー

2020/01/19 01:30

>input['type=number']でまとめたほうが良いかなとも思います。 そういう事すっと、将来破綻すっぞ。 適切にクラス分けしとけよ…。
m.ts10806

2020/01/19 01:38

ケースバイケース。
退会済みユーザー

退会済みユーザー

2020/01/19 01:39

なわけねぇだろ。 ほんとに仕事してんのか? おめぇ。
m.ts10806

2020/01/19 02:09

前から言ってますがあなたの反応はもう結構です。
退会済みユーザー

退会済みユーザー

2020/01/19 02:14

おめぇの願望に拘束力なんかねぇって、おめぇ自信が何度も質問者に言ってる事だろw type=numberでロジック組むって、 後から別のtype=numberなinputフィールド追加される可能性 全く考えてねぇだろ、おめぇ。
退会済みユーザー

退会済みユーザー

2020/01/19 02:47

「前から言ってますが」っていったらさ、 m.ts10806はまえから何度もおかしな事言っておらに突っ込まれてるけど、 絶対に自分の間違い認めねぇよな。 そういう所がおめぇの一番カッコ悪ぃところだと思うぞ。
退会済みユーザー

退会済みユーザー

2020/01/19 03:14

あとさ、すげぇ不思議なのが、質問者がparseInt()を使ったときに、「基数を指定してください」って言わねぇのな、m.ts10806って奴。 ほんと、大丈夫か?って思った。
退会済みユーザー

退会済みユーザー

2020/01/19 03:15

他の細けぇことはぐちぐちぐちぐち指摘するくせに、JSのparseInt()で基数については何も言わねぇとか、ちょっと、おら、考えられねぇぞ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問