phpで電卓を作っています。今の電卓は小数点のついた数字を入力した際、計算できない使用になっています。ここを改善したいです。アドバイス・ヒントをいただきたいです。
現状ctype_digitを使って数字のみを計算に反映させているのですが、小数点のつく数字を数値として認識してくれません。is_numericを使う手も考えたのですが、これだと2進法や16進法が自動的に10進法に変換されてしまうため、別の方法を探しています。
私の予想では48行目のelseをelseifにして新たに少数だった場合の条件付けをしてあげればいいように思うのですが、煮詰まってしまっています。お知恵をください。
php
1<?php 2 3//ここで全角数字と悪意のある書き込みをはじいています 4if($_POST['left'] != "" && $_POST['right'] != "" ){ 5 $left = mb_convert_kana(htmlspecialchars($_POST['left'], ENT_QUOTES, 'UTF-8'),"rn"); 6 $right = mb_convert_kana(htmlspecialchars($_POST['right'], ENT_QUOTES, 'UTF-8'),"rn"); 7 8 if(ctype_digit($left)&&ctype_digit($right)){ 9 10 11 switch($_POST['symbol']){ 12 case "": 13 $answer='error'; 14 echo '<p>エラー4</p>'; 15 echo '計算記号を選択してください'; 16 echo '<br>'; 17 18 case "+": 19 $answer=$left+$right; 20 break; 21 22 case "-": 23 $answer=$left-$right; 24 break; 25 26 case "×": 27 $answer=$left*$right; 28 break; 29 30 case "÷": 31 32 if($_POST['right']==0 and $_POST['symbol']=='÷'){ 33 $answer='error'; 34 echo '<p>エラー3</p>'; 35 echo '0以外の数字を入れてください'; 36 echo "<br>"; 37 38 }else{ 39 $answer=$left/$right; 40 41 }break; 42 default: 43 } 44 45 //計算結果を表示 46 echo '<br>'; 47 echo ($left.' '.$_POST['symbol'].' '.$right.' '.'='.' '.$answer); 48 49 }else{ 50 $answer='error'; 51 echo '<p>エラー2</p>'; 52 echo '数字を入力してください'; 53 echo '<br>'; 54 } 55}else{ 56echo '<p>エラー1</p>'; 57echo '値を入力してください'; 58echo '<br>'; 59return; 60} 61?>
html
1<!DOCTYPE html> 2 <html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>電卓</title> 6 </head> 7 <body> 8 <form action="calc1111-3.php" method="post"> 9 <input type= "text" name="left" size=3> 10 11 <select name="symbol" size=1> 12 <option value="">選択してください</option> 13 <option value="+">+</option> 14 <option value="-">-</option> 15 <option value="×">×</option> 16 <option value="÷">÷</option> 17 </select> 18 19 <input type="text" name="right" size=3> =? 20 <br> 21 <input type="submit" value="計算"> 22 <input type="reset" value="クリア"> 23 24 </form> 25 <p>計算結果: 26 <?php if($answer == true) 27 echo ($left.' '.$_POST['symbol'].' '.$right.' '.'='.' '.$answer); ?></p> 28 29 </body> 30</html>