繁体   English   中英

如何将字符串转换为 PHP 中的数字?

[英]How do I convert a string to a number in PHP?

我想将这些类型的值'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;

有几种方法可以做到这一点:

  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()

为避免出现问题,请尝试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
?>

在任何(松散类型的)语言中,您始终可以通过向其添加零来将字符串转换为数字。

但是,这样做没有什么意义,因为 PHP 会在使用此变量时自动执行此操作,并且无论如何都会在 output 时将其转换为字符串。

请注意,您可能希望将带点的数字保留为字符串,因为在转换为浮点数之后,由于浮点数的性质,它可能会发生不可预测的更改。

不必选择是将string转换为int还是float ,只需向其添加一个0会自动将结果转换为数字类型。

// 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;

是的,在 PHP 中有一个类似的方法,但是鲜为人知,您很少听说过它。 它是一个称为“身份”的算术运算符,如下所述:

算术运算符

要将数字字符串转换为数字,请执行以下操作:

$a = +$a;

如果你想为$value = '0.4'得到一个浮点数,但是为$value = '4'得到一个整数,你可以这样写:

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

它有点脏,但是可以用。

您可以使用:

(int)(your value);

或者您可以使用:

intval(string)

你可以随时给它加零!

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

PHP 中,您可以使用intval(string) or floatval(string)函数将字符串转换为数字。

在某些情况下,只需对可能有用且更安全的答案做一点说明。 您可能需要首先检查字符串是否实际包含有效数值,然后才将其转换为数字类型(例如,如果您必须操作来自将整数转换为字符串的数据库的数据)。 您可以使用is_numeric()然后使用floatval()

$a = "whatever"; // any variable

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

这是实现您正在寻找的 function。 首先我们检查这个值是否可以被理解为一个数字,如果可以,我们把它变成一个 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;
    }
}

如果你想要一个字符串的数值,并且因为不确定而不想将它转换为 float/int,这个技巧将把它转换为正确的类型:

function get_numeric($val) {
  if (is_numeric($val)) {
    return $val + 0;
  }
  return 0;
}

Example:
<?php
get_numeric('3'); // int(3)
get_numeric('1.2'); // float(1.2)
get_numeric('3.0'); // float(3)
?>

来源: https://www.php.net/manual/en/function.is-numeric.php#107326

除了Boykodev 的回答,我还建议:

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

我一直在阅读答案,但没有看到有人提到 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,以便将字符串转换为类型数字。

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

好吧,所以我刚遇到这个问题。 我的问题是有问题的数字/字符串有不同的位数。 有些没有小数点,有些则有几个。 所以对我来说,使用intfloatdoubleintvalfloatval都会根据数字给我不同的结果。

所以,简单的解决方案......将字符串除以 1 服务器端。 这迫使它成为一个数字并保留所有数字,同时修剪不必要的 0。 它不漂亮,但它有效。

"your number string" / 1

Input       Output
"17"        17
"84.874"    84.874
".00234"    .00234
".123000"   .123
"032"       32

这是我为自己简化事情而写的 function:

它还返回 boolean、integer、double 和 real 的速记版本。

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';

我发现在 JavaScript 中,将字符串转换为数字的一种简单方法是将其乘以 1。它解决了连接问题,因为“+”符号在 JavaScript 中有多种用途,而“*”符号纯粹是用于数学乘法。

基于我在这里看到的关于 PHP 自动愿意将包含数字的字符串解释为数字的内容(以及关于添加的评论,因为在 PHP 中“+”纯粹是为了数学加法),这个乘法技巧工作得很好对于 PHP,也。

我已经对其进行了测试,它确实有效......尽管取决于您获取字符串的方式,您可能希望在乘以 1 之前对其应用 trim() function。

迟到了,但这是另一种方法:

function cast_to_number($input) {
    if(is_float($input) || is_int($input)) {
        return $input;
    }
    if(!is_string($input)) {
        return false;
    }
    if(preg_match('/^-?\d+$/', $input)) {
        return intval($input);
    }
    if(preg_match('/^-?\d+\.\d+$/', $input)) {
        return floatval($input);
    }
    return false;
}

cast_to_number('123.45');       // (float) 123.45
cast_to_number('-123.45');      // (float) -123.45
cast_to_number('123');          // (int) 123
cast_to_number('-123');         // (int) -123
cast_to_number('foo 123 bar');  // false
$a = "10";

$b = (int)$a;

您可以使用它在PHP 中将字符串转换为 int。

function convert_to_number($number) {
    return is_numeric($number) ? ($number + 0) : FALSE;
}

您可以使用:

((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;

你可以这样写:

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

有一种方法:

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

使用is_*将不起作用,因为variable是 a: string

使用json_encode()json_decode()的组合,它被转换成它的“真实”形式。 如果它是一个真正的string ,那么它会 output 错误。

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

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

将 output: string(2) "Me" int(0) float(0)

现在我们处于一个严格/强类型在 PHP 中具有更大重要性的时代,我使用json_decode

$num = json_decode('123');

var_dump($num); // outputs int(123)

$num = json_decode('123.45');

var_dump($num); // outputs float(123.45)

您可以按如下方式更改数据类型

$number = "1.234";

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

settype($number , "float");

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

由于历史原因,在浮动的情况下返回“double”。

PHP 文档

如果你事先不知道你有一个浮点数还是一个 integer,
如果字符串可能包含特殊字符(如空格、€ 等),
如果它可能包含超过 1 个点或逗号,
你可以使用这个 function:

// 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;
}

所有建议都失去了数字类型。

在我看来,这是一个最佳实践:

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";
}
//Get Only number from string
$string = "123 Hello Zahid";
$res = preg_replace("/[^0-9]/", "", $string);
echo $res."<br>";
//Result 123

它可以实现的众多方法之一是:

$fileDownloadCount          =  (int) column_data_from_db;
$fileDownloadCount++;

第二行将值递增 1。

使用一元运算符 (+)。 例如:

$n1 = +'7';
$n2 = '2.34';
$n2 = +$n1;

var_dump($n1): int(7) var_dump($n2): float(2.34)

您可以只将 0 添加到您的字符串中,然后将其转换为数字而不会丢失初始原始值。 尝试例如:

dd('0.3454545' + 0)

PHP 将为您处理转换,或者按照已经建议的那样在您的字符串前添加 +。

PHP会在限度内为您办好

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

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

在一次编程面试中,我遇到了这样一个问题:“假设您正在编写内置 function 以将 integer 转换为 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);

不同的方法:

  1. 将其全部推送到数组/关联数组中。
  2. json_encode($your_array, JSON_NUMERIC_CHECK); 可以选择解码回去
  3. 利润!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM