私は値が、これらのタイプの変換したい'3'
、'2.34'
、'0.234343'
数に、など。JavaScriptではを使用Number()
できますが、PHPで使用できる同様のメソッドはありますか?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
私は値が、これらのタイプの変換したい'3'
、'2.34'
、'0.234343'
数に、など。JavaScriptではを使用Number()
できますが、PHPで使用できる同様のメソッドはありますか?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
回答:
PHPはほとんどの状況で型を強制するので、通常これを行う必要はありません。型を明示的に変換したい場合は、キャストしてください:
$num = "3.14";
$int = (int)$num;
$float = (float)$num;
.
小数点区切り文字であると想定しても安全ではない場合があります。en.wikipedia.org/wiki/…–
これにはいくつかの方法があります。
文字列を数値プリミティブデータ型にキャストします。
$num = (int) "10";
$num = (double) "10.12"; // same as (float) "10.12";
文字列に対して数学演算を実行します。
$num = "10" + 1;
$num = floor("10.1");
intval()
またはを使用floatval()
:
$num = intval("10");
$num = floatval("10.1");
を使用しsettype()
ます。
(double)
はの単なるエイリアスであることに注意してください(float)
。
$num = "10" + 1
例)。
intval("9999999999")==2147483647
。
intval
array_map('intval', $arrayOfStrings);
キャストではできない場所でも使えるので便利です。
$num = "10" + 1;
これ$num = "10" * 1;
は値(乗算の中立要素)を変更しないため使用する方が良い代わりにtoNumber(..)
、最終的な型は文字列 "10"->(int)10の変換に必要なものによって決定されるため、基本的にはこれに似ています。"10.1"->(float)10.1;
問題を回避するには、を試してください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
?>
12.7896
ですか?
(int)$my_str
私は文字列などを特別に扱っているので機能しないこと、01
および013
ベース10として解釈したいことをすでに知っていました...したがって、ベースを明示的に提供する方法が必要でした。
どのような(緩やかに型付けされた)言語でも、文字列にゼロを追加することで、常に文字列を数値にキャストできます。
ただし、PHPはこの変数を使用するときに自動的に行い、出力時にとにかく文字列にキャストされるため、これにはほとんど意味がありません。
浮動小数点数にキャストした後、浮動小数点数の性質上、予測不能に変更される可能性があるため、ドット付きの数字を文字列として保持することをお勧めします。
typeof('123'+0)
提供します'string'
ので、'123'+0
提供します'1230'
。
0+'123'
ます123
以下を使用できます。
(int)(your value);
または、以下を使用できます。
intval(string)
is_float
、それが渡される場合はの(float)
代わりにでキャストし(int)
ます。
の浮動小数点数を取得したいが、の$value = '0.4'
整数を取得したい場合は$value = '4'
、次のように記述できます。
$number = ($value == (int) $value) ? (int) $value : (float) $value;
少し汚れていますが、動作します。
strpos($val, '.') === false ? intval($val) : floatval($val);
localeconv()['decimal_point']
代わりに使用できると思います'.'
。このstrpos
ソリューションの利点の1つは、2回キャストする場合のほぼ2倍の速さです。
2.1e2
が小数点を持っているが、得られた数は整数である、
+
識別演算子を使用するだけでvar_dump(+'0.4', +'4')
、floatとintが得られます。php.net/manual/en/language.operators.arithmetic.php
いつでもゼロを追加できます。
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
。何か案が?
はい、PHPにも同様の方法がありますが、あまり知られていないため、ほとんど聞いていません。ここで説明するように、これは「恒等」と呼ばれる算術演算子です。
数値文字列を数値に変換するには、次のようにします。
$a = +$a;
is_numeric
正しく変換できない文字列を処理するコードを配置する場所があります。)
ここにあなたが探しているものを達成する機能があります。最初に、値が数値として理解できるかどうかを確認します。数値として理解できる場合は、それを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;
}
}
JavaScriptで文字列を数値に変換する簡単な方法は、それを1で乗算することです。 "+"記号はJavaScriptで複数回使用されますが、 "*"記号は純粋に数学的な乗算。
PHPが数字を含む文字列を数値として自動的に解釈する用意があること(およびPHPの「+」は純粋に数学的な加算であるため、加算に関するコメント)に関して私がここで見たことに基づいて、この乗算トリックはうまく機能しますPHPの場合も同様です。
私はそれをテストしましたが、うまくいきます...文字列を取得した方法にもよりますが、1を掛ける前に、trim()関数を適用することをお勧めします。
これは、私が物事を簡単にするために書いた関数です。
また、ブール、整数、倍精度、実数の短縮形も返します。
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';
Boykodevの答えに加えて、私はこれをお勧めします:
Input Output
'2' * 1 2 (int)
'2.34' * 1 2.34 (float)
'0.3454545' * 1 0.3454545 (float)
$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;
$ target_id_cron =(int)$ id_cron-1;
A non well formed numeric value encountered
文字列をfloatに変更したいときにこのエラーが発生しました$num = '12,24' * 1
。なにか提案を?
単にあなたはこのように書くことができます:
<?php
$data = ["1","2","3","4","5"];
echo json_encode($data, JSON_NUMERIC_CHECK);
?>
PHPは制限内でそれを行います
<?php
$str = "3.148";
$num = $str;
printf("%f\n", $num);
?>
やり方がある:
$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);
は次の理由により、使用is_*
できませんvariable
:string
。
組み合わせを使用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)
私は答えを読んでいますが、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" >= 1000000
false と評価されますが、次のように"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文字列をそれぞれの数値に変換する方法
浮動小数点数または整数があるかどうかが事前にわからず
、文字列に特殊文字(スペース、€など)
が含まれている可能性があり、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;
}
異なるアプローチ:
json_encode($your_array, JSON_NUMERIC_CHECK);
オプションでデコードして戻す