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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

2539閲覧

【php】小数も数字としてカウントするには何の関数を使うべきか

sepi-0401

総合スコア10

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/11/10 22:56

編集2016/11/10 23:01

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>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/11/10 23:26

結果が0以下だと表示されない気がする
sepi-0401

2016/11/10 23:29

本当ですね。答えがマイナスになる場合はきちんと計算されて表示されるのですが、枠の中にマイナスを入れると数字扱いになりませんね。ご指摘ありがとうございます。
sepi-0401

2016/11/10 23:36

これもctype_digitによるものなのでしょうか?
退会済みユーザー

退会済みユーザー

2016/11/11 00:42

VIEW側の「 <?php if($answer == true)」 ほうですよ 表示されないのでは
sepi-0401

2016/11/11 01:30

そちらでしたか。以前はこの個所にechoを書いていなかったのですが、計算結果を同じ場所に表示させたいと思い新たに付け加えました。ここの$answerは値が正しく取れていても反応してくれません。
guest

回答2

0

小数点を有効にしたいのであれば、正規表現を使えばできそうですけどね。以下のような感じでしょうか
※なお、以下の処理では16進数はNG扱いになります。

php

1preg_match('|^\d+(\.\d+)?$|', $str);

以下、動くサンプルコード

php

1<?php 2function isMyNumeric($str) { 3 return (bool) preg_match('|^\d+(\.\d+)?$|', $str); 4} 5function test($str) { 6 echo "$str : " . (isMyNumeric($str) ? 1 : 0) . "\n"; 7} 8 9test('12345'); // OK 10test('12.345'); // OK 11test('0.12345'); // OK 12// 以下はNG 13test('12..345'); 14test('12345.'); 15test('.12345'); 16test('12.34.5'); 17test('-1234.5'); 18test('1234a5');

(追記)
先頭のマイナスを許可したバージョンも載せておきます

php

1preg_match('|^-?\d+(\.\d+)?$|', $str);

投稿2016/11/10 23:18

編集2016/11/12 12:12
popobot

総合スコア6586

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

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

退会済みユーザー

退会済みユーザー

2016/11/10 23:29

数値と判定したいの方であれば 0x1234a5はtrue出なくてはいけないきが
popobot

2016/11/11 00:36

コメントありがとうございます! うーん、質問の意図は小数点を有効にしたいけど、16進数は無効にしたいのかと思っていますが違うんですかね...。よくかわらないので、質問者のコメントを待ちますです...。
sepi-0401

2016/11/11 01:25

私のやりたいことはicchiiさんに近いです。1001を勝手に10などに変換されては困ると考えています。16進数もしかりです。
sepi-0401

2016/11/11 01:27

icchiiさん、回答ありがとうございます。 私が初心者すぎて「正規表現」が理解できず、随分と時間がたってしまいました。この関数をctype_digitの箇所に置き換えれば動くのでしょうか?
popobot

2016/11/11 02:09

はい、置き換えれば、うまくいくと思います。テストしてくださいね。 正規表現は、不明な点があれば、説明しますので聞いてください。
KiyoshiMotoki

2016/11/12 04:30

icchii様 横から失礼します。 ご提示のサンプルコードに  // 以下はNG  ...  test('-1234.5'); とあることから、意図的に負の値を除外しているように見受けるのですが、これはなぜでしょうか? 電卓であれば、負値も入力できる方が良いと、個人的には思うのですが。。
popobot

2016/11/12 07:04

コメントありごとうございます。特に考えていませんでした...。確かに電卓であれば負を許可したほうがいいかもしれませんね!
KiyoshiMotoki

2016/11/12 11:19

icchii様 返信ありがとうございます。 なるほど、そう言うことでしたか...w
guest

0

文字数のカウントなら
strlen(strval(1.5)) でいいはず

投稿2016/11/10 23:17

編集2016/11/10 23:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sepi-0401

2016/11/11 01:35

回答ありがとうございます。 お恥ずかしながらstrlenもstrvalも初めて聞いた関数で、絶賛戸惑っています。 前者はまだ正直理解しきれていませんが、後者ならなんだか使えそうな気がしてきました。 ちょっと頑張ってみます
退会済みユーザー

退会済みユーザー

2016/11/11 02:23

ああ見当違いが判明しているので この回答はきにしないでもいいですよ。 文字数としてのカウントの意味としてでの回答なんで
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問