PHPで文字列を数値に変換するにはどうすればよいですか?


669

私は値が、これらのタイプの変換したい'3''2.34''0.234343'数に、など。JavaScriptではを使用Number()できますが、PHPで使用できる同様のメソッドはありますか?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545

62
読者は注意してください:この質問に対する実際の答えはありません:(
Matthieu Napoli

@MatthieuNapoli答えは、通常、Phpがあなたのためにそれを理解するということです-動的型システムの特典の1つです。
Kolobキャニオン

12
すべての不確実性の連鎖と「通常」。
person27

2
@MatthieuNapoli型キャストが「本当の答え」ではないのはなぜですか?タイプキャストをした後にタイプについて確認することもできます
Kolob Canyon

3
@MatthieuNapoli猫の皮をむく方法が1つではなく、これを行う方法がないということをあなたがポイントを明確にしたことをうれしく思います。たとえば、データベース操作ではキャストが非常に重要です。たとえば、パラメーター化されたPDOクエリでは、パーサーが文字列ではなく数値であることをパーサーが認識するのに苦労することがあり、文字列をintにキャストしなかったため、整数フィールドで0になるパラメータステップで。
stubsthewizard 2018

回答:


1029

PHPはほとんどの状況で型を強制するので、通常これを行う必要はありません。型を明示的に変換したい場合は、キャストしてください:

$num = "3.14";
$int = (int)$num;
$float = (float)$num;

4
ここで状況は少し異なります(数字のみを含む)文字列を一般的な数値に変換します。UはjavaScriptで知っているように、parseInt()を使用してstring => intを変換するか、parseFloat()を使用してstring => floatを変換できます。しかし、一般的にjavaScriptはNumber()を使用して文字列=>数値を変換します。PHPで同様のメソッドが必要ですか?
サラ

4
蛾の名前の配列から値を取得するために使用した、完全な日付文字列から月番号を取得した場合、これは私にとって便利でした。文字列インデックスは有効ですが同等ではないため、ここでは自動キャストは行われません。
Cazuma Nii Cavalcanti 2013

19
コンテキストによっては、それが.小数点区切り文字であると想定しても安全ではない場合があります。en.wikipedia.org/wiki/…–
デイブジャービス、

3
@Sara:最初に整数にキャストし、次に浮動小数点数に変換してから、両方の値(整数と浮動小数点数)が等しいかどうかを比較して、文字列を数値に変換する関数を作成することもできます。そうである場合は、値を整数として返し、そうでない場合は浮動小数点数として返す必要があります。あなたがアイデアを得ることを願っています。
Youstay Igo 2016

2
整数をファイルシステムに渡す必要がある場合があります。PHPが変換を行うのを待つことはお勧めできません。
AaA

173

これにはいくつかの方法があります。

  1. 文字列を数値プリミティブデータ型にキャストします。

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
  2. 文字列に対して数学演算を実行します。

    $num = "10" + 1;
    $num = floor("10.1");
  3. intval()またはを使用floatval()

    $num = intval("10");
    $num = floatval("10.1");
  4. を使用しsettype()ます。


9
これ(double)はの単なるエイリアスであることに注意してください(float)
だます

4
@downvoter、私は私の答えで何が悪いのかわかりません。OPが彼女の質問を編集する前にこれを投稿したことに注意してください。ただし、これは編集された質問もカバーしています($num = "10" + 1例)。
fardjad

2
@ ed-ta:文字列を渡した場合、0ではなく最小値/最大値を返すことを確認してください。すなわちintval("9999999999")==2147483647
riv 2015

6
intvalarray_map('intval', $arrayOfStrings);キャストではできない場所でも使えるので便利です。
icc97 2016年

2
$num = "10" + 1;これ$num = "10" * 1;は値(乗算の中立要素)を変更しないため使用する方が良い代わりにtoNumber(..)、最終的な型は文字列 "10"->(int)10の変換に必要なものによって決定されるため、基本的にはこれに似ています。"10.1"->(float)10.1;
Holly

57

問題を回避するには、を試してくださいintval($var)。いくつかの例:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34 (octal as starts with zero)
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26 (hex as starts with 0x)
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

4
私見、数値列の基数を考慮するのはこれだけなので、これが唯一の正解です。数値文字列に1つ以上の先行ゼロがあり、文字列が8進数を基数とするものではない場合、単純に型キャストを使用するすべての応答(ユーザー定義関数を示唆するものも含む)は失敗します。
構文Junkie

「12.7896」をに変換したい場合はどうすればよい12.7896ですか?
Agnes Palit

文字列を浮動小数点数に変換するには、floatval()を使用します。floatval( "12.7896")は12.7896を返します
gopeca

なぜこれは受け入れられた答えではないのですか?PHPの部外者として、(int)$my_str私は文字列などを特別に扱っているので機能しないこと、01および013ベース10として解釈したいことをすでに知っていました...したがって、ベースを明示的に提供する方法が必要でした。
Giacomo Alzetta

48

どのような(緩やかに型付けされた)言語でも、文字列にゼロを追加することで、常に文字列を数値にキャストできます。

ただし、PHPはこの変数を使用するときに自動的に行い、出力時にとにかく文字列にキャストされるため、これにはほとんど意味がありません。

浮動小数点数にキャストした後、浮動小数点数の性質上、予測不能に変更される可能性があるため、ドット付きの数字を文字列として保持することをお勧めします。


35
ゼロを追加して文字列を数値にキャストできない言語は数多くありますが、通常は有効なキャスト方法ではなくエラーと見なされます:)。
JanŠpaček2013

4
honzaspはJavaScriptで、たとえば、右でtypeof('123'+0)提供します'string'ので、'123'+0提供します'1230'
Oriol

5
PHPでは、ほとんどの場合===スタイルの比較を使用することをお勧めします。あなたのデータを比較する場合は、それが保存されているどのタイプだから、それは非常に重要になることがあります。
ジョナサン・

ゼロを追加することで、本当の意味で「キャスティング」しないことに注意してください。基本的には変換しています。
CSᵠ

12
JavaScriptで@oriolを使用するには、数値をゼロに追加する必要があり0+'123'ます123
Timo Huovinen 2013年

24

以下を使用できます。

(int)(your value);

または、以下を使用できます。

intval(string)

入力した数値が「2.3456」の場合、2.3456を取得するにはどうすればよいですか?
サラ

6
問題は、フロートについてです。
taseenb 2013

floatと書かれているOPの1行を表示しますか?コメントと反対票を渡す前に、元の投稿を確認してください。
noobie-php 2013

2
この例は浮動小数点数を示しています。数値文字列を数値(浮動小数点数と整数)に変換する方法を尋ねています
taseenb

最初に、数値がで浮動小数点数であるかどうかを確認しis_float、それが渡される場合はの(float)代わりにでキャストし(int)ます。
マーティンファンドリエル

24

の浮動小数点数を取得したいが、の$value = '0.4'整数を取得したい場合は$value = '4'、次のように記述できます。

$number = ($value == (int) $value) ? (int) $value : (float) $value;

少し汚れていますが、動作します。


3
おそらく汚れが少ない?strpos($val, '.') === false ? intval($val) : floatval($val);
jchook

4
@jchookロケールに依存するため、おそらくもっと汚い-たとえば、「0.4」ではなく「0,4」。
Nick Rice

いい視点ね。のlocaleconv()['decimal_point']代わりに使用できると思います'.'。このstrposソリューションの利点の1つは、2回キャストする場合のほぼ2倍の速さです。
jchook 2017

2
ケースが好きで、その破壊を@jchook 2.1e2が小数点を持っているが、得られた数は整数である、
トマシュBlatný

1
+識別演算子を使用するだけでvar_dump(+'0.4', +'4')、floatとintが得られます。php.net/manual/en/language.operators.arithmetic.php
tvanc

15

いつでもゼロを追加できます。

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)

このエラーが発生しましたA non well formed numeric value encountered。何か案が?
Agnes Palit

15

stringintまたはに変換するかどうかを選択する代わりに、float単純にa 0を追加するだけで、PHPが結果を数値型に自動的に変換します。

// Being sure the string is actually a number
if (is_numeric($string))
    $number = $string + 0;
else // Let the number be 0 if the string is not a number
    $number = 0;

13

PHPを使用できintval(string) or floatval(string)数値に文字列を変換する機能を。


4
いいえ、私は一般的な方法を望んでいます。つまり、 '5' => 5に変換する必要があり、 '2.345' => 2.345に変換する必要があります。
サラ

13

はい、PHPにも同様の方法がありますが、あまり知られていないため、ほとんど聞いていません。ここで説明するように、これは「恒等」と呼ばれる算術演算子です。

算術演算子

数値文字列を数値に変換するには、次のようにします。

$a = +$a;

警告:ハッキングが検出されました。
グレッグ

@Gregさん、こんにちは。ここに投稿されたリンクをクリックしましたか?これは開発者がこの演算子について言ったことです:$ aのintまたはfloatへの適切な変換。ここでの「変換」は、数値から数値への変換として理解できません。どうして?排他的な算術の観点から、この演算子はまったく役に立たないからです。任意の数値に「+1」(恒等関数と同等)を掛けても、まったく影響はありません。したがって、ここで提案されている型変換以外に、この演算子の他のユーティリティを想像することはできません。
aldemarcalazans

@Greg-確かに、これは他のほとんどの答えよりもハックではありません。その組み込み演算子は、要求されたとおりのことを行います。(最初に確認するのがおそらく最善ですが、is_numeric正しく変換できない文字列を処理するコードを配置する場所があります。)
ToolmakerSteve

キャストに算術演算子を使用することは完全に機能することは理解していますが、見落としがちです。警告する価値があると思います。
グレッグ、

11

場合によっては便利で安全な回答に少しだけ注意してください。最初に文字列に実際に有効な数値が含まれているかどうかを確認してから、それを数値型に変換する必要がある場合があります(たとえば、intを文字列に変換するdbからのデータを操作する必要がある場合)。is_numeric()次に使用できますfloatval()

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type

9

ここにあなたが探しているものを達成する機能があります。最初に、値が数値として理解できるかどうかを確認します。数値として理解できる場合は、それをintおよびfloatに変換します。intとfloatが同じ(たとえば、5 == 5.0)の場合、int値を返します。intとfloatが同じでない場合(たとえば、5!= 5.3)、floatの精度が必要であると想定し、その値を返します。値が数値でない場合は、警告をスローしてnullを返します。

function toNumber($val) {
    if (is_numeric($val)) {
        $int = (int)$val;
        $float = (float)$val;

        $val = ($int == $float) ? $int : $float;
        return $val;
    } else {
        trigger_error("Cannot cast $val to a number", E_USER_WARNING);
        return null;
    }
}

6

JavaScriptで文字列を数値に変換する簡単な方法は、それを1で乗算することです。 "+"記号はJavaScriptで複数回使用されますが、 "*"記号は純粋に数学的な乗算。

PHPが数字を含む文字列を数値として自動的に解釈する用意があること(およびPHPの「+」は純粋に数学的な加算であるため、加算に関するコメント)に関して私がここで見たことに基づいて、この乗算トリックはうまく機能しますPHPの場合も同様です。

私はそれをテストしましたが、うまくいきます...文字列を取得した方法にもよりますが、1を掛ける前に、trim()関数を適用することをお勧めします。


6

これは、私が物事を簡単にするために書いた関数です。

また、ブール、整数、倍精度、実数の短縮形も返します。

function type($mixed, $parseNumeric = false)
{        
    if ($parseNumeric && is_numeric($mixed)) {
        //Set type to relevant numeric format
        $mixed += 0;
    }
    $t = gettype($mixed);
    switch($t) {
        case 'boolean': return 'bool'; //shorthand
        case 'integer': return 'int';  //shorthand
        case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
        default: return $t;
    }
}

parseNumericをtrueに設定してタイプを呼び出すと、タイプをチェックする前に数値文字列が変換されます。

したがって:

type( "5"、true)はintを返します

type( "3.7"、true)はfloatを返します

type( "500")は文字列を返します

これは一種の誤ったチェック方法であり、実際の変数は文字列のままなので注意してください。必要に応じて、実際の変数を正しい型に変換する必要があります。データベースがアイテムIDまたはエイリアスをロードするかどうかを確認するために必要なだけで、実行時に文字列として解析されるため、予期しない影響はありません。

編集する

オブジェクトが関数かどうかを検出したい場合は、このケースをスイッチに追加します。

case 'object': return is_callable($mixed)?'function':'object';

6

Boykodevの答えに加えて、私はこれをお勧めします:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)

これについて少し考えた後、1による除算を提案することもできます:)
Boykodev

1
それがポイントです!:)ところで、あなたの解決策は上記のすべての科学的表記よりもはるかに優れています。ありがとうございました。
Drugan 2016年

この解決策は私の問題を解決しました。私の場合、$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;$ target_id_cron =(int)$ id_cron-1;
-inMILD

1
A non well formed numeric value encountered文字列をfloatに変更したいときにこのエラーが発生しました$num = '12,24' * 1。なにか提案を?
Agnes Palit

5
$a = "10";

$b = (int)$a;

これを使用して、PHPで文字列をintに変換できます。


2
入力した数値が「7.2345」の場合、(int)は使用できません(float)を使用する必要があります。私に必要なのは、一般的な解決策です。
サラ

1
常にdoubleまたはfloatを使用できます。
Pritom

5

単にあなたはこのように書くことができます:

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>

3
このコードは質問に答えることがありますが、このコードが質問に答える理由および/または方法に関する追加のコンテキストを提供すると、その長期的な価値が向上します。
Alex Riabov

1
あなたはこれについて確信を持っていますか?これは文字列を数値に変換しませんが、配列をJSON文字列に変換します
Nico Haase

はい、@ NicoHaase数値が配列内の文字列形式の場合、数値に変換されます。
ドミニクアマルジョーF

5

数値に1を掛けるだけで、文字列は数値型に変換されます。

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}

十分に公正ですが、この方法(および同様のトリック)は、この質問に対する他の24の回答に既にリストされています。もう一度投稿しても意味がありません。
DavidW

4

以下を使用できます。

((int) $var)   ( but in big number it return 2147483647 :-) )

しかし、最善の解決策は以下を使用することです:

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

または

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;

2

次のようにデータ型を変更できます

$number = "1.234";

echo gettype ($number) . "\n"; //Returns string

settype($number , "float");

echo gettype ($number) . "\n"; //Returns float

歴史的な理由から、floatの場合は「double」が返されます。

PHPドキュメント


2

すべての提案は数値型を失います。

これは私にとってベストプラクティスのようです:

function str2num($s){
// Returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "\nret=$return_value type=".gettype($return_value)."\n";
}

1

PHPは制限内でそれを行います

<?php
   $str = "3.148";
   $num = $str;

   printf("%f\n", $num);
?>

出したくない。変換して変数に保存したい。
サラ

1
これは自動的にフロートに変換しました。PHPのルーズタイプ変換がそれを行います。それはあなたが期待することをしないかもしれないので、明示的な変換の他の答えはあなたのためによりよく働くかもしれません。
エイドリアンコーニッシュ2011

$ strには、printf( "%f \ n"、$ str)を使用して '5'または '5.258'を含めることができます。'5 'は5.280000に対して5.000000(5として欲しい)として出力されますより多くの小数点。
サラ

1

やり方がある:

$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

は次の理由により、使用is_*できませんvariablestring

組み合わせを使用json_encode()して、json_decode()それはそれの「真」の形に変換されます。trueの場合string、誤って出力されます。

$num = "Me";
$int = (int)$num;
$float = (float)$num;

var_dump($num, $int, $float);

出力されます: string(2) "Me" int(0) float(0)


0

プログラミングインタビューで「PHPで整数を文字列にキャストするための組み込み関数を書いていたとしたら、その関数はどのように書けますか」という質問を受けました。これが解決策です。

$nums = ["0","1","2","3","4","5","6","7","8","9"];
$int = 15939; 
$string = ""; 
while ($int) { 
    $string .= $nums[$int % 10]; 
    $int = (int)($int / 10); 
} 
$result = strrev($string);

0

私は答えを読んでいますが、PHPの数値変換における最大の注意点について誰も言及していませんでした。

最も賛成された答えは、次のことを提案しています:

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3

そりゃ素晴らしい。PHPは直接キャストを行います。しかし、次のようにした場合はどうでしょうか。

$str = "3.14is_trash"
$intstr = (int)$str

PHPはそのような変換を有効と見なしますか?

どうやらはい

PHPは、必要なタイプの最初の非数値文字が見つかるまで文字列を読み取ります。整数の場合、数字は[0-9]です。その結果、3[0-9]の文字範囲であるため、を読み取り続けます。読む.[0-9]の範囲にないため、そこでと停止を行います。

floatまたはdoubleにキャストする場合も同様です。PHPは3、それから.、それ1から、それから、それから、そして4、で止まるでしょうiことが有効なフロート数字ではありませんので、。

結果として、"million" >= 1000000false と評価されますが、次のように"1000000million" >= 1000000評価されますtrueます。

以下も参照してください。

https://www.php.net/manual/en/language.operators.comparison.php比較しながら変換がどのように行われるか

https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion文字列をそれぞれの数値に変換する方法


0

浮動小数点数または整数があるかどうかが事前にわからず
、文字列に特殊文字(スペース、€など)
が含まれている可能性があり、1つ以上のドットまたはコンマが含まれている可能性がある場合は、
これを使用できます関数:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
    // return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/\d/', $string)) {
        return 0;
    } 

    // Replace all ',' with '.':
    $workingString = str_replace(',', '.', $string);

    // Keep only number and '.':
    $workingString = preg_replace("/[^0-9.]+/", "", $workingString);

    // Split the integer part and the decimal part,
    // (and eventually a third part if there are more 
    //     than 1 decimal delimiter in the string):
    $explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

    if (sizeof($explodedString) === 1) {
        // No decimal delimiter was present in the string,
        // create a string representing an integer:
        $workingString = $explodedString[0];
    } else {
        // A decimal delimiter was present,
        // create a string representing a float:
        $workingString = $explodedString[0] . '.' .  $explodedString[1];
    }

    // Create a number from this now non-ambiguous string:
    $number = $workingString * 1;

    return $number;
}

-8

異なるアプローチ:

  1. すべてを配列/連想配列にプッシュします。
  2. json_encode($your_array, JSON_NUMERIC_CHECK); オプションでデコードして戻す
  3. 利益!

7
スタックオーバーフローは、ジョークではなく質問への回答に関するものです。そのための場所は確かにあると思いますが、この場所はそうではありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.