PHPで文字列などを数値に変換する方法について

採用はこちら

目次

PHPで文字列などを数値に変換する主な方法

PHPでは、文字列や浮動小数点数などの値を整数や小数へ変換できます。
代表的な方法は、(int)(float)による型キャスト、intval()floatval()settype()などです。

ただし、フォームやAPIなどから受け取った値を数値として扱う場合は、単純に型変換するだけでなく、入力値が想定した形式になっているかを確認することが重要です。
「変換」と「検証」は別の処理として考えましょう。

(int)で整数に変換する

文字列を整数へ変換する基本的な方法が、(int)による型キャストです。

$value = "123";
$number = (int) $value;

var_dump($number);

実行結果は次のようになります。

int(123)

型キャストでは、元の変数そのものが変更されるわけではありません。

$value = "123";

var_dump($value);
var_dump((int) $value);

実行結果は次のようになります。

string(3) "123"
int(123)

元の$valueは文字列のままで、キャストした値だけが整数として扱われます。

小数をintに変換すると小数部分が取り除かれる

小数を含む値を整数へ変換すると、小数部分が取り除かれます。

$value = "123.99";
$number = (int) $value;

echo $number;

結果は次のとおりです。

123

これは四捨五入ではありません。

また、厳密には「切り捨て」というより、0方向へ整数化されると考えると正確です。

echo (int) 1.9;
echo (int) -1.9;

結果はそれぞれ次のようになります。

1
-1

負の値に対してfloor()を使用すると-2になるため、整数キャストと数学的な切り捨ては異なります。

四捨五入が必要な場合は、round()などを使用します。

intval()で整数値を取得する

intval()を使って整数値を取得することもできます。

$value = "123";
$number = intval($value);

var_dump($number);

結果は次のようになります。

int(123)

単純な10進数の変換では、(int)intval()はよく似た用途で利用できます。

intval()では基数を指定できる

intval()の特徴の一つが、第2引数で基数を指定できることです。

たとえば、16進数の文字列を10進数へ変換する場合は次のように書けます。

$value = "ff";
$number = intval($value, 16);

echo $number;

結果は次のとおりです。

255

2進数の場合は次のように指定します。

echo intval("1010", 2);

結果は次のとおりです。

10

10進数以外の数値表現を変換したい場合は、intval()が便利です。

(float)で小数に変換する

小数を含む数値へ変換したい場合は、(float)を使用できます。

$value = "123.45";
$number = (float) $value;

var_dump($number);

$numberはfloat型として扱われます。

整数形式の文字列もfloatへ変換できます。

$value = "100";
$number = (float) $value;

var_dump($number);

整数と小数を含む計算を行う場合などに利用できます。

floatval()でfloat値を取得する

floatval()を使ってfloat値を取得する方法もあります。

$value = "123.45";
$number = floatval($value);

var_dump($number);

単純な変換であれば、次の2つは近い目的で使用できます。

$number = (float) $value;
$number = floatval($value);

短く書きたい場合は型キャストが便利です。

一方、関数として明示的にfloat値を取得したい場合はfloatval()を利用できます。

settype()で変数そのものの型を変更する

settype()を利用すると、変数そのものの型を変更できます。

$value = "123";

settype($value, "integer");

var_dump($value);

この場合、$valueそのものが整数型に変更されます。

floatへ変更する場合は次のように書けます。

$value = "123.45";

settype($value, "float");

var_dump($value);

型キャストとの違い

型キャストでは、元の変数を変更せずに変換後の値を利用できます。

$value = "123";

$number = (int) $value;

一方、settype()では対象の変数自体が変更されます。

$value = "123";

settype($value, "integer");

通常は、

$value = (int) $value;

のように型キャストして再代入する書き方も分かりやすく、よく利用されます。

is_numeric()で数値として扱えるか確認する

外部から受け取った値を数値へ変換する場合は、事前に数値として有効か確認することも重要です。

PHPではis_numeric()を利用できます。

$value = "123";

if (is_numeric($value)) {
    $number = (int) $value;
}

is_numeric()は、値が数値または数値形式の文字列であればtrueを返します。

小数や負の数も判定できる

たとえば、次のような値は数値として判定されます。

var_dump(is_numeric("123"));
var_dump(is_numeric("123.45"));
var_dump(is_numeric("-123.45"));

そのため、小数を許可する入力では次のように利用できます。

$input = "123.45";

if (is_numeric($input)) {
    $number = (float) $input;
}

is_numeric()は科学的記数法も数値として判定する

is_numeric()を入力検証に利用するときは、科学的記数法にも注意が必要です。

たとえば、

var_dump(is_numeric("1e3"));

trueになります。

1e3は科学的記数法で1000を表すためです。

そのため、「0〜9だけで構成された整数を入力してほしい」といったケースでは、is_numeric()だけでは条件が広すぎる場合があります。

整数だけを許可するならFILTER_VALIDATE_INTを使う

年齢や個数、ページ番号など、整数だけを受け付けたい場合はFILTER_VALIDATE_INTを利用できます。

$value = "25";

$result = filter_var($value, FILTER_VALIDATE_INT);

if ($result !== false) {
    echo $result;
}

整数として有効な値であれば、整数値が返されます。

=== falseで厳密に比較する

FILTER_VALIDATE_INTを利用する場合は、判定方法にも注意が必要です。

$value = "0";

$result = filter_var($value, FILTER_VALIDATE_INT);

if ($result === false) {
    echo "入力エラー";
}

整数の0は有効な値です。

そのため、次のように書くのは避けたほうがよいでしょう。

if (!$result) {
    // 0もfalse相当として扱われる
}

falseと整数の0を区別するため、=== falseで厳密に比較することが重要です。

フォーム入力を数値に変換する方法

HTMLフォームから送信された値は、PHPでは文字列として受け取るケースが多くあります。

たとえば、年齢を受け取る場合は次のように書けます。

$age = $_POST['age'] ?? '';

単純に整数へ変換するだけなら次のように書けます。

$age = (int) ($_POST['age'] ?? 0);

しかし、ユーザーが正しい整数を入力したか確認したい場合は、検証を行うほうが適切です。

$age = $_POST['age'] ?? '';

$result = filter_var($age, FILTER_VALIDATE_INT);

if ($result === false) {
    echo "正しい整数を入力してください";
} else {
    $age = $result;

    echo $age;
}

重要なのは、数値へ変換できることと、入力内容が正しいことは同じではないという点です。

カンマ区切りの文字列を数値に変換する

金額などでは、次のようなカンマ区切りの文字列を扱うことがあります。

1,000

カンマを取り除いてから数値へ変換する方法があります。

$value = "1,000";

$value = str_replace(',', '', $value);

if (is_numeric($value)) {
    $number = (int) $value;
}

この場合、1000として扱えます。

カンマを削除するだけでは不十分な場合がある

ユーザー入力では、単純にカンマを削除するだけでは不正な形式まで許可する可能性があります。

たとえば、

1,2,3

という値でも、

str_replace(',', '', $value);

を行えば、

123

になってしまいます。

桁区切りの形式を厳密にチェックしたい場合は、カンマを削除する前に正規表現などで入力形式を検証するとよいでしょう。

全角数字を数値へ変換する

日本語サイトでは、ユーザーが次のような全角数字を入力することがあります。

12345

mbstring拡張が利用できる環境では、mb_convert_kana()を使って半角数字へ変換できます。

$value = "12345";

$value = mb_convert_kana($value, 'n', 'UTF-8');

if (is_numeric($value)) {
    $number = (int) $value;
}

全角数字を半角数字へ正規化してから検証・変換することで、日本語フォームでも柔軟に対応できます。

配列内の文字列をまとめて数値に変換する

複数の文字列をまとめて整数へ変換したい場合は、array_map()を利用できます。

$values = ["10", "20", "30"];

$numbers = array_map('intval', $values);

print_r($numbers);

無名関数やアロー関数を使う方法もあります。

$numbers = array_map(
    fn($value) => (int) $value,
    $values
);

小数へ変換する場合は、floatval()を利用できます。

$values = ["10.5", "20.8", "30.2"];

$numbers = array_map('floatval', $values);

ただし、外部入力から作られた配列を扱う場合は、変換前に各要素が正しい形式か検証することも重要です。

大きな整数を変換するときの注意点

PHPのintには表現できる範囲があります。

そのため、非常に大きな数値文字列を無条件に整数へ変換すると、正確に扱えない可能性があります。

特に、次のようなデータは文字列として保持したほうが適切なケースがあります。

  • 電話番号
  • 郵便番号
  • 会員番号
  • 商品コード
  • 外部サービスのID
  • クレジットカード番号

たとえば、

$postalCode = "0123456";

を整数へ変換すると、

$postalCode = (int) $postalCode;

先頭の0が失われます。

123456

数字だけで構成されていても、計算する必要がない識別情報は文字列として管理するのが基本です。

floatを金額計算に使う場合の注意点

PHPのfloatは、10進小数を常に完全に正確に表現できるわけではありません。

たとえば、0.1や0.2といった値は、コンピュータ内部の2進浮動小数点数では正確に表現できない場合があります。

そのため、金額のように誤差が問題になる処理では注意が必要です。

用途によっては、金額を最小単位の整数で保持する方法があります。

たとえば、

19.99

を、

1999

のような整数として管理する方法です。

また、高精度な小数計算が必要な場合は、BCMathなどの利用も検討できます。

PHPで数値変換するときは「検証」と「変換」を分ける

PHPで数値変換を行う際に特に重要なのが、入力値の検証と型変換を分けて考えることです。

たとえば、

$value = (int) $input;

と書けば整数へ変換できます。

しかし、変換できたからといって、元の入力がアプリケーションの仕様に合っていたとは限りません。

外部入力を扱う場合は、基本的に次の流れで処理すると分かりやすくなります。

入力値を取得
↓
必要に応じて正規化
↓
入力形式を検証
↓
必要な数値型へ変換

たとえば整数なら、

$input = $_POST['count'] ?? '';

$result = filter_var($input, FILTER_VALIDATE_INT);

if ($result === false) {
    echo "正しい整数を入力してください";
} else {
    $count = $result;
}

といった処理が考えられます。

PHPの数値変換方法のまとめ

PHPで文字列などを数値へ変換する場合は、用途に応じて方法を使い分けます。

整数へ変換するなら、

$number = (int) $value;

または、

$number = intval($value);

を利用できます。

小数を扱うなら、

$number = (float) $value;

または、

$number = floatval($value);

が利用できます。

変数そのものの型を変更する場合は、settype()も使用できます。

また、フォームやAPIなどの外部入力では、数値へ変換する前にis_numeric()FILTER_VALIDATE_INTなどを利用し、用途に合った形式か確認することが重要です。

特に、is_numeric()は小数や負数だけでなく科学的記数法も数値として判定するため、「整数だけ」「数字だけ」といった厳密な条件がある場合は、目的に合った検証方法を選ぶ必要があります。

さらに、電話番号や郵便番号、IDなどは数字だけで構成されていても計算に使用する数値ではないため、文字列として管理したほうが適切です。

PHPで数値を扱う際は、単に型を変換するだけでなく、データの用途を考えながら「正規化・検証・変換」を適切に組み合わせることが大切です。

以上、PHPで文字列などを数値に変換する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次