回答編集履歴

1

追加

2020/07/26 05:21

投稿

退会済みユーザー
test CHANGED
@@ -42,323 +42,465 @@
42
42
 
43
43
 
44
44
 
45
- ```HTML
46
-
47
- <!doctype html>
48
-
49
- <html lang="ja">
50
-
51
- <head>
52
-
53
- <!-- Required meta tags -->
54
-
55
- <meta charset="utf-8">
56
-
57
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
58
-
59
-
60
-
61
- <!-- Bootstrap CSS -->
62
-
63
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
64
-
65
-
66
-
67
- <title></title>
68
-
69
- <style>
70
-
71
- #loading, #results {
72
-
73
- display:none;
74
-
75
- }
76
-
77
- </style>
78
-
79
-
80
-
81
-
82
-
83
- </head>
84
-
85
- <body class="bg-dark">
86
-
87
- <div class="container">
88
-
89
- <div class="row">
90
-
91
- <div class="col-md-6 mx-auto">
92
-
93
- <div class="card card-body text-center mt-5">
94
-
95
- <h6 class="heading display-5 pb-3">loan calc</h6>
96
-
97
- <form name="loanform">
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
- <div class="form-group">
108
-
109
- <div class="input-group">
110
-
111
- <span class="input-group-addon">amount</span>
112
-
113
- <input class="form-control t_rlt" id="amount" name="amount" placeholder="amount">
114
-
115
- </div>
116
-
117
- </div>
118
-
119
-
120
-
121
- <div class="form-group">
122
-
123
- <div class="input-group">
124
-
125
- <span class="input-group-addon">downpayment</span>
126
-
127
- <input class="form-control t_rlt" id="downpayment" name="downpayment" placeholder="downpayment">
128
-
129
- </div>
130
-
131
- </div>
132
-
133
-
134
-
135
- <div class="form-group">
136
-
137
-
138
-
139
- <div class="input-group">
140
-
141
-
142
-
143
- <span class="input-group-addon">combind bonus</span>
144
-
145
- <input class="form-control t_rlt" id="cb_amount" name="cb_amount" placeholder="combind bonus">
146
-
147
- </div>
148
-
149
- </div>
150
-
151
-
152
-
153
- <div class="form-group">
154
-
155
- <select class="form-control" name="years" id="years">
156
-
157
- </select>
158
-
159
- </div>
160
-
161
-
162
-
163
- <div class="form-group">
164
-
165
- <input type="submit" value="submit" class="btn btn-dark btn-block">
166
-
167
- </div>
168
-
169
- </form>
170
-
171
- <div id="loading">
172
-
173
- <img src="img/loading.gif" alt="Loading">
174
-
175
- </div>
176
-
177
- <div id="results" class="pt-4">
178
-
179
- <h5>result</h5>
180
-
181
-
182
-
183
- <div class="form-group">
184
-
185
- <div class="input-group">
186
-
187
- <span class="input-group-addon">Years </span>
188
-
189
- <input class="form-control t_rlt" id="showyears" disabled>
190
-
191
- </div>
192
-
193
- </div>
194
-
195
-
196
-
197
- <div class="form-group">
198
-
199
- <div class="input-group">
200
-
201
- <span class="input-group-addon">Interest</span>
202
-
203
- <input class="form-control t_rlt" id="showinterest" disabled>
204
-
205
- </div>
206
-
207
- </div>
208
-
209
-
210
-
211
-
212
-
213
- <div class="form-group">
214
-
215
- <div class="input-group">
216
-
217
- <span class="input-group-addon">monthly payment</span>
218
-
219
- <input class="form-control t_rlt" id="monthly-payment2" disabled>
220
-
221
- </div>
222
-
223
- </div>
224
-
225
- <div class="form-group">
226
-
227
- <div class="input-group">
228
-
229
- <span class="input-group-addon">Fist month payment</span>
230
-
231
- <input class="form-control t_rlt" id="monthly-payment1" disabled>
232
-
233
- </div>
234
-
235
- </div>
236
-
237
-
238
-
239
-
240
-
241
- <div class="form-group">
242
-
243
- <div class="input-group">
244
-
245
- <span class="input-group-addon">Combined bonus</span>
246
-
247
- <input class="form-control t_rlt" id="cb_input" disabled>
248
-
249
- </div>
250
-
251
- </div>
252
-
253
-
254
-
255
- <div class="form-group">
256
-
257
- <div class="input-group">
258
-
259
- <span class="input-group-addon">Combined bonus paying times</span>
260
-
261
- <input class="form-control t_rlt" id="cb_num" disabled>
262
-
263
- </div>
264
-
265
- </div>
266
-
267
-
268
-
269
- <div class="form-group">
270
-
271
- <div class="input-group">
272
-
273
- <span class="input-group-addon">total bonus paying times</span>
274
-
275
- <input class="form-control t_rlt" id="cb_everypayment" disabled>
276
-
277
- </div>
278
-
279
- </div>
280
-
281
-
282
-
283
-
284
-
285
- <div class="form-group">
286
-
287
- <div class="input-group">
288
-
289
- <span class="input-group-addon">total - downpayment </span>
290
-
291
- <input class="form-control t_rlt" id="showdiffrence" disabled>
292
-
293
- </div>
294
-
295
- </div>
296
-
297
-
298
-
299
- <div class="form-group">
300
-
301
- <div class="input-group">
302
-
303
- <span class="input-group-addon">total payment</span>
304
-
305
- <input class="form-control t_rlt" id="total-payment" disabled>
306
-
307
- </div>
308
-
309
- </div>
310
-
311
-
312
-
313
- <div class="form-group">
314
-
315
- <div class="input-group">
316
-
317
- <span class="input-group-addon">total interest</span>
318
-
319
- <input class="form-control t_rlt" id="total_interest" disabled>
320
-
321
-
322
-
323
- </div>
324
-
325
- </div>
326
-
327
- </div>
328
-
329
- </div>
330
-
331
- </div>
332
-
333
- </div>
334
-
335
- </div>
336
-
337
-
338
-
339
-
340
-
341
- <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
342
-
343
- <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
344
-
345
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
346
-
347
- <script src="eng.js"></script>
348
-
349
-
350
-
351
-
352
-
353
-
354
-
355
-
356
-
357
- </body>
358
-
359
-
360
-
361
- </html>
45
+
46
+
47
+ ```JS
48
+
49
+ /**
50
+
51
+ * エレメントの属性値
52
+
53
+ */
54
+
55
+ var elementId = {
56
+
57
+ downpayment: "downpayment", // 頭金
58
+
59
+ amount: "amount", // 製品料金
60
+
61
+ cb_amount: "cb_amount", // ボーナス併用払い
62
+
63
+ years: "years" // yearsコンボボックス
64
+
65
+ }
66
+
67
+
68
+
69
+ /**
70
+
71
+ * yearsコンボボックス要素
72
+
73
+ */
74
+
75
+ var yearsElement = {
76
+
77
+ blank: {
78
+
79
+ value: "",
80
+
81
+ dispName: "select payment yeart",
82
+
83
+ intValue: 0,
84
+
85
+ interest: 0
86
+
87
+ },
88
+
89
+ aa1: {
90
+
91
+ value: "aa1",
92
+
93
+ dispName: "1 year payment",
94
+
95
+ intValue: 1,
96
+
97
+ interest: 1.5
98
+
99
+ },
100
+
101
+ bb2: {
102
+
103
+ value: "bb2",
104
+
105
+ dispName: "2 year payment",
106
+
107
+ intValue: 2,
108
+
109
+ interest: 2.5
110
+
111
+ }
112
+
113
+ }
114
+
115
+
116
+
117
+ /**
118
+
119
+ * DOMLoaded
120
+
121
+ */
122
+
123
+ document.addEventListener("DOMContentLoaded", function(e) {
124
+
125
+
126
+
127
+ // submit
128
+
129
+ document.loanform.addEventListener('submit', function(e) {
130
+
131
+ onSubmit(e);
132
+
133
+ });
134
+
135
+ // yearsコンボボックス要素設定
136
+
137
+ setSelectboxValue(elementId.years, yearsElement);
138
+
139
+ }, false)
140
+
141
+
142
+
143
+ /**
144
+
145
+ * サブミットイベント
146
+
147
+ */
148
+
149
+ function onSubmit(e) {
150
+
151
+ // 入力チェック通過後、calculateResultsを実行する
152
+
153
+ if (checkValue()) {
154
+
155
+ // 活性制御
156
+
157
+ document.getElementById('results').style.display = 'none';
158
+
159
+ document.getElementById('loading').style.display = 'block';
160
+
161
+
162
+
163
+ // calculateResults実行
164
+
165
+ setTimeout(calculateResults, 3500);
166
+
167
+ }
168
+
169
+ e.preventDefault();
170
+
171
+ }
172
+
173
+
174
+
175
+ /**
176
+
177
+ * セレクトボックス要素設定
178
+
179
+ * @param id セットするセレクトボックスのid
180
+
181
+ * @param object セットするオブジェクト
182
+
183
+ * セットするオブジェクトはkey.valueの形式であること
184
+
185
+ */
186
+
187
+ function setSelectboxValue(id, object) {
188
+
189
+ let selectBox = document.getElementById(id);
190
+
191
+ let loopCnt = 1;
192
+
193
+
194
+
195
+ // 要素数分ループ
196
+
197
+ Object.keys(object).forEach(function(key) {
198
+
199
+ let element = document.createElement("option");
200
+
201
+ element.value = object[key].value;
202
+
203
+ element.innerHTML = object[key].dispName;
204
+
205
+ if (loopCnt == 1) {
206
+
207
+ element.selected = true;
208
+
209
+ }
210
+
211
+ selectBox.appendChild(element);
212
+
213
+
214
+
215
+ loopCnt++;
216
+
217
+ });
218
+
219
+ }
220
+
221
+
222
+
223
+ /**
224
+
225
+ * 計算前チェック処理
226
+
227
+ * @return チェックOK:true, チェックNG:false
228
+
229
+ */
230
+
231
+ function checkValue() {
232
+
233
+ let rtn = true; // 返却用
234
+
235
+
236
+
237
+ let downpayment = document.getElementById(elementId.downpayment).value; // 頭金
238
+
239
+ let amount = document.getElementById(elementId.amount).value; // 製品料金
240
+
241
+ let cb_amount = document.getElementById(elementId.cb_amount).value; // ボーナス支払い金額
242
+
243
+ let selectedYears = document.getElementById(elementId.years).value; // yearsコンボボックス
244
+
245
+ // 必須チェック
246
+
247
+ if (!amount) {
248
+
249
+
250
+
251
+ // amountが未設定の場合エラー
252
+
253
+ showError("Please check amount");
254
+
255
+ rtn = false;
256
+
257
+
258
+
259
+ } else if (!downpayment) {
260
+
261
+
262
+
263
+ // downpaymentが未設定の場合エラー
264
+
265
+ showError("Please check downpayment.");
266
+
267
+ rtn = false;
268
+
269
+
270
+
271
+ } else if (!cb_amount) {
272
+
273
+
274
+
275
+ // cb_amountが未設定の場合エラー
276
+
277
+ showError("Please check cb_amount.");
278
+
279
+ rtn = false;
280
+
281
+
282
+
283
+ } else if (!selectedYears) {
284
+
285
+
286
+
287
+ // yearsが未選択の場合エラー
288
+
289
+ showError("Please check selectbox of years.");
290
+
291
+ rtn = false;
292
+
293
+
294
+
295
+ }
296
+
297
+
298
+
299
+ // 必須チェックがtrueの場合、相関チェックを行う
300
+
301
+ if (rtn) {
302
+
303
+
304
+
305
+ if (cb_amount >= ( amount - downpayment ) / 2 ) {
306
+
307
+
308
+
309
+ // ボーナス併用払い金額 >= 商品代金と頭金の差額 / 2の場合エラー
310
+
311
+ showError("正しい金額を入力してください");
312
+
313
+ rtn = false;
314
+
315
+ }
316
+
317
+ }
318
+
319
+
320
+
321
+ // チェック通過
322
+
323
+ return rtn;
324
+
325
+ }
326
+
327
+
328
+
329
+ /**
330
+
331
+ * 金利の算出
332
+
333
+ */
334
+
335
+ function calculateResults(e) {
336
+
337
+ let downpayment = document.getElementById(elementId.downpayment).value; // 頭金
338
+
339
+ let amount = document.getElementById(elementId.amount).value; // 製品料金
340
+
341
+ let cb_amount = document.getElementById(elementId.cb_amount).value; // ボーナス支払い金額
342
+
343
+ let years, interest;
344
+
345
+
346
+
347
+ // yearsコンボボックス内選択値に応じて、years, interestをENUMから設定
348
+
349
+ let selectedYears = document.getElementById(elementId.years).value; // yearsコンボボックス
350
+
351
+ years = yearsElement[selectedYears].intValue;
352
+
353
+ interest = yearsElement[selectedYears].interest;
354
+
355
+
356
+
357
+ // 算出
358
+
359
+ console.log('Calculating...');
360
+
361
+ console.log('downpayment = ' + downpayment);
362
+
363
+ console.log('amount = ' + amount);
364
+
365
+ console.log('cb_amount = ' + cb_amount);
366
+
367
+
368
+
369
+
370
+
371
+ const difference = amount - downpayment; // 商品代金と頭金の差額
372
+
373
+ const cbTimes = years * 2; // ボーナス支払いの回数
374
+
375
+ const cbEveryPayment = cb_amount / cbTimes; // ボーナス一回あたりに支払う金額
376
+
377
+ const paymentTimes = years * 12; // 支払い回数(ボーナス除く)
378
+
379
+ const interestMod = 1 + (interest / 100); // 手を加えた金利を算出
380
+
381
+ // const amountWithoutBns = difference * interestMod;
382
+
383
+ const totalPayment = (difference - cb_amount) * interestMod; // ボーナス支払い以外の支払金額を算出
384
+
385
+ const justDevideMonthlyPayment = totalPayment / paymentTimes; // ひと月辺りの支払額を一度算出
386
+
387
+ const secondToLastMonthlyPayment = (Math.floor(justDevideMonthlyPayment / 100) * 100); // 10円単位の切り捨て
388
+
389
+ const firstMonthlyPayment = totalPayment - (secondToLastMonthlyPayment * (paymentTimes - 1)); // 切り捨て額を1ヶ月目の支払額に集約
390
+
391
+ const totalInterest = (difference * interestMod) - difference; // 商品にかかる金利
392
+
393
+
394
+
395
+
396
+
397
+ // 各項目にセット
398
+
399
+ document.getElementById('monthly-payment1').value = comma(parseInt(firstMonthlyPayment));
400
+
401
+ document.getElementById('monthly-payment2').value = comma(parseInt(secondToLastMonthlyPayment));
402
+
403
+ document.getElementById('total-payment').value = comma(parseInt(interestMod));
404
+
405
+ document.getElementById('total_interest').value = comma(parseInt(totalInterest));
406
+
407
+ document.getElementById('showyears').value = years;
408
+
409
+ document.getElementById('showinterest').value = interest / 100;
410
+
411
+ document.getElementById('showdiffrence').value = comma(parseInt(difference));
412
+
413
+ document.getElementById('cb_num').value = cbTimes;
414
+
415
+ document.getElementById('cb_input').value = comma(parseInt(cb_amount));
416
+
417
+ document.getElementById('cb_everypayment').value = comma(parseInt(cbEveryPayment));
418
+
419
+ }
420
+
421
+
422
+
423
+ /**
424
+
425
+ * 金額をカンマ編集する
426
+
427
+ * @param num 金額
428
+
429
+ * @return カンマ編集後の金額
430
+
431
+ */
432
+
433
+ function comma(num) {
434
+
435
+ return String(num).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
436
+
437
+ }
438
+
439
+
440
+
441
+ /*
442
+
443
+ * エラーハンドラ
444
+
445
+ */
446
+
447
+
448
+
449
+ // Error message
450
+
451
+ function showError(error){
452
+
453
+ console.log("Error ..." + error);
454
+
455
+
456
+
457
+ // create a div
458
+
459
+ const errorDiv = document.createElement("div");
460
+
461
+
462
+
463
+ // get element
464
+
465
+ const card = document.querySelector(".card");
466
+
467
+ const heading = document.querySelector(".heading");
468
+
469
+
470
+
471
+ // add class
472
+
473
+ errorDiv.className = "alert alert-danger";
474
+
475
+
476
+
477
+ // create text node and append div
478
+
479
+ errorDiv.appendChild(document.createTextNode(error));
480
+
481
+
482
+
483
+ // Insert error above heading
484
+
485
+ card.insertBefore(errorDiv, heading);
486
+
487
+
488
+
489
+ // clear error after 3 secs.
490
+
491
+ setTimeout(clearError, 3000);
492
+
493
+ }
494
+
495
+
496
+
497
+ // clear error function
498
+
499
+ function clearError() {
500
+
501
+ document.querySelector(".alert").remove();
502
+
503
+ }
362
504
 
363
505
  ```
364
506