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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

2回答

457閲覧

【PHP】string数字をfloat数値にキャストすると0になってしまう原因が分からない

meex

総合スコア83

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2023/11/15 08:41

編集2023/11/15 08:42

実現したいこと

文字型数字を数値に変換したい。その際、0にならずに変換できるようにしたい。

発生している問題

キャストしようとするとなぜか要素1番目だけが0になってしまいます。

該当のソースコード

PHP

1$tmp = ['‎27.6', '8.7', '2.2']; 2Log::info($tmp); 3 4$tate = (float)$tmp[0]; 5$yoko = (float)$tmp[1]; 6$height = (float)$tmp[2]; 7Log::info('['.$tate.']'); 8Log::info('['.$yoko.']'); 9Log::info('['.$height.']');

この時の結果が以下の通りです。
[2023-11-15 17:30:23] local.INFO: array (
0 => '‎27.6',
1 => '8.7',
2 => '2.2 ',
)
[2023-11-15 17:30:23] local.INFO: [0]
[2023-11-15 17:30:23] local.INFO: [8.7]
[2023-11-15 17:30:23] local.INFO: [2.2]

試したこと

こうしても、

$tate = $tmp[0] * 1; Log::info('['.$tate.']');

0になってしまいます。


試しに[0]に別の値を入れてみると、うまくいきます。

$tmp[0] = $tmp[2]; $tate = (float)$tmp[0]; $yoko = (float)$tmp[1]; $height = (float)$tmp[2]; DD::info('['.$tate.']'); DD::info('['.$yoko.']'); DD::info('['.$height.']'); [2023-11-15 17:32:53] local.INFO: [2.2] [2023-11-15 17:32:53] local.INFO: [8.7] [2023-11-15 17:32:53] local.INFO: [2.2]

[0]を別の要素に入れてみると

$tmp[1] = $tmp[0]; $tate = (float)$tmp[0]; $yoko = (float)$tmp[1]; $height = (float)$tmp[2]; DD::info('['.$tate.']'); DD::info('['.$yoko.']'); DD::info('['.$height.']'); [2023-11-15 17:35:20] local.INFO: [0] [2023-11-15 17:35:20] local.INFO: [0] [2023-11-15 17:35:20] local.INFO: [2.2]

となります。


試しに、[0]の先頭に数字を加えると、元々tmp[0]に入っていたはずの「'‎27.6'」の値が消えてしまいます。

$tmp[0] = '90000'.$tmp[0]; $tate = (float)$tmp[0]; $yoko = (float)$tmp[1]; $height = (float)$tmp[2]; DD::info('['.$tate.']'); DD::info('['.$yoko.']'); DD::info('['.$height.']'); [2023-11-15 17:37:14] local.INFO: [90000] [2023-11-15 17:37:14] local.INFO: [8.7] [2023-11-15 17:37:14] local.INFO: [2.2]

なぜこのような現象になるのでしょうか?

補足情報(FW/ツールのバージョンなど)

php -v
Cannot load Xdebug - it was already loaded
PHP 8.0.25 (cli) (built: Oct 25 2022 10:49:29) ( ZTS Visual C++ 2019 x64 )
Copyright (c) The PHP Group
Zend Engine v4.0.25, Copyright (c) Zend Technologies
with Xdebug v3.2.1, Copyright (c) 2002-2023, by Derick Rethans

php artisan -V
Cannot load Xdebug - it was already loaded
Laravel Framework 8.83.27

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

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

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

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

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

melian

2023/11/15 08:50

$tmp = ['27.6', '8.7', '2.2']; の '27.6' の部分ですが、シングルクォートと 2 の間に LEFT-TO-RIGHT MARK(U+200E) が入っています。
guest

回答2

2

この'27.6'は、2の前にU+200Eという見えない文字が混入しています。

投稿2023/11/15 08:45

maisumakun

総合スコア146626

kei344, yambejp👍を押しています

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

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

0

ベストアンサー

まぁあえてやるなら数値とピリオド以外を削除するとか

PHP

1$tmp = ['?27.6', '8.7', '2.2']; 2$tate = (float) preg_replace('/[^\d.]/','',$tmp[0]); 3$yoko = (float) preg_replace('/[^\d.]/','',$tmp[1]); 4$height = (float) preg_replace('/[^\d.]/','',$tmp[2]); 5var_dump([$tate,$yoko,$height]);

ただし本来キャストできる指数表記が通用しなくなります

PHP

1var_dump((float) '4E-3');

投稿2023/11/15 09:40

yambejp

総合スコア117771

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

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

meex

2023/11/15 10:36

ありがとうございます!! そのような見えない文字が入ってしまうのですね。。。 調べたところこちらを読んでより理解を深めることができたので、自身の振り返りのメモとして載せておきます。 https://ameblo.jp/ysama2021/entry-12738754763.html $tmp0Split = str_split($tmp[0]); をやってみたところ [2023-11-15 19:32:57] local.INFO: array ( 0 => '�', 1 => '�', 2 => '�', 3 => '2', 4 => '7', 5 => '.', 6 => '6', のようになっており、確かに文字がある事を伺えました。 ご指示があった内容で試したところ無事に動かしたい処理にすることができたので解決といたします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問