ChatGPT解决这个技术问题 Extra ChatGPT

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

我想将这些类型的值 '3''2.34''0.234343' 等转换为数字。在 JavaScript 中我们可以使用 Number(),但在 PHP 中有没有类似的方法可用?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545
读者当心:这个问题没有真正的答案:(
@MatthieuNapoli 答案是通常Php 会为您计算出来——动态类型系统的好处之一。
带着所有不确定性和“通常”的链条。
我想我在 5 年前的意思是没有单个函数接受字符串并返回正确的 intfloat(你通常不想要 floatint 给出)。
@MatthieuNapoli 我很高兴您澄清了您的意思,即有不止一种方法可以给猫剥皮,而不是没有办法做到这一点。例如,强制转换在数据库操作中非常重要。例如,在参数化 PDO 查询中,有时解析器很难意识到它是一个数字而不是字符串,然后你在整数字段中得到一个 0,因为你没有将字符串转换为 int在参数步骤中。

d
deceze

您通常不需要这样做,因为 PHP 在大多数情况下会为您强制类型。对于您确实想要显式转换类型的情况,cast 它:

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

这里的情况有点不同我想将任何字符串(仅包含数字)转换为通用数字。 U 可能知道在 JavaScript 中我们可以使用 parseInt() 来转换 string=>int 或 parseFloat() 来转换 string=>float。但一般 JavaScript 使用 Number() 来转换字符串 => 数字。我想在php中使用类似的方法?
当我从完整的日期字符串中获取月份数时,它对我很有用,我曾经从蛾名数组中提取一个值。此处不会发生自动转换,因为字符串索引是有效的,但不是等效的。
根据上下文,假设 . 是小数点分隔符可能不安全。 en.wikipedia.org/wiki/…
@Sara:您还可以创建一个将字符串转换为数字的函数,首先将其转换为整数,然后再转换为浮点数,然后比较两个值(整数和浮点数)是否相等。如果是,则应将值作为整数返回,如果不是,则作为浮点数返回。希望你能明白。
有时您需要将整数传递给文件系统,等待 PHP 为您进行转换不是一个好主意。
f
fardjad

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

将字符串转换为数字原始数据类型: $num = (int) "10"; $num = (double) "10.12"; // 等同于 (float) "10.12";对字符串执行数学运算:$num = "10" + 1; $num = 楼层(“10.1”);使用 intval() 或 floatval(): $num = intval("10"); $num = floatval("10.1");使用 settype()。


请注意,(double) 只是 (float) 的别名。
@downvoter,我不知道我的回答有什么问题。请注意,我在 OP 编辑她的问题之前发布了此内容,但这也涵盖了已编辑的问题($num = "10" + 1 示例)。
@ed-ta:很确定如果您将字符串传递给它,它将返回最小值/最大值而不是 0。即intval("9999999999")==2147483647
intval 很有用,因为这样您就可以在 array_map('intval', $arrayOfStrings); 中使用它,而这是投射无法做到的。
而不是 $num = "10" + 1;,最好使用 $num = "10" * 1;,因为这不会改变值(乘法的中性元素),这本质上类似于 toNumber(..),因为最终类型将由转换字符串所需的内容决定“ 10" -> (int) 10; “10.1”-> (浮动)10.1;
S
SharpC

为避免出现问题,请尝试 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”转换为12.7896,知道吗?
使用 floatval() 将字符串转换为浮点数。 floatval("12.7896") 将返回 12.7896
为什么这不是公认的答案?作为一个 PHP 局外人,我已经知道 (int)$my_str 行不通,因为我专门处理我想解释为基数为 10 的字符串,如 01013...所以我想要一种明确提供基础的方法。
P
Peter Mortensen

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

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

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


有许多语言不能通过添加零将字符串转换为数字,这通常被认为是错误而不是有效的转换方法:)。
honzap 是对的,例如在 JavaScript 中 typeof('123'+0) 给出 'string',因为 '123'+0 给出 '1230'
注意,在 PHP 中建议大多数时候使用 === 样式比较。因此,如果您要比较您的数据,那么它存储的类型可能非常重要。
javascript 中的 @oriol 您需要将数字加到零 0+'123' 才能获得 123
@JonathonWisnoski:如果您使用 < 或 >,则更为重要,因为它对数字和字符串具有不同的含义(即“10”<“2”但 10 > 2)。
P
Peter Mortensen

无需选择是将 string 转换为 int 还是 float,您只需添加一个 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;

a
aldemarcalazans

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

Aritmetic Operators

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

$a = +$a;

警告:检测到黑客攻击。
嗨@格雷格。您是否点击了此处发布的链接?这就是开发人员对这个运算符所说的:酌情将 $a 转换为 int 或 float。这里的“转换”不能理解为数到数的转换。为什么?因为从排他算术的角度来看,这个运算符绝对没用!将任何数字乘以“+1”(相当于恒等函数)对其绝对没有影响。因此,除了此处建议的类型转换之外,我无法想象此运算符的其他实用程序。
@Greg - 与大多数其他答案相比,这肯定是 less 的黑客攻击。它是一个内置的运算符,可以完全按照要求进行操作。 (虽然最好先检查 is_numeric,所以有一个地方放置代码来处理无法正确转换的字符串。)
我知道使用算术运算符进行强制转换非常有效,但是很容易错过。我认为值得警告。
@Greg - 我同意任何时候代码都会做一些读者可能不明显的事情,评论是值得的! (虽然它仍然不是黑客,因为它的用法正是文档所说的 - 虽然我个人不会知道,所以我很高兴在那里看到评论。)
P
Peter Mortensen

如果您想获得 $value = '0.4' 的浮点数,但 $value = '4' 的整数,您可以编写:

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

它有点脏,但它有效。


可能不那么脏? strpos($val, '.') === false ? intval($val) : floatval($val);
@jchook 可能更脏,因为它取决于语言环境 - 例如“0,4”而不是“0.4”。
@jchook 在 2.1e2 等情况下中断,它有小数点,但结果数字是整数
@TomášBlatný 不,不是。这在 PHP 中计算为 false。您可能将“浮点数”与“包含小数部分的数字”混淆了……显然 210.0 是浮点数,而在 PHP 中 2.1e2 是浮点数。试试看。浮点数与数字存储在 RAM 中并表示为数字文字的方式有关。
只需使用 + 标识运算符:var_dump(+'0.4', +'4'),为您提供一个浮点数和一个整数。 php.net/manual/en/language.operators.arithmetic.php
P
Peter Mortensen

您可以使用:

(int)(your value);

或者您可以使用:

intval(string)

如果输入的数字是“2.3456”,我如何得到 2.3456?
问题也与花车有关。
给我看 OP 的 1 行,上面写着浮动?在通过评论和否决票之前,请查看原始帖子。
该示例显示浮点数,它询问如何将数字字符串转换为数值(浮点数和整数)
@MartinvanDriel - 这不是一个数字。它是一个字符串。问题是如何根据需要从字符串中获取 int 或 float 结果。 is_float 不会为字符串返回 false 吗?
P
Peter Mortensen

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


不,我想要一个通用的方法。这意味着如果它的 '5' => 它应该转换为 5,如果它的 '2.345' => 它应该转换为 2.345。
不适合我,它将“3”转换为 0 零。
B
Boykodev

您可以随时添加零!

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。任何想法?
这太棒了,我从来没有读过这样的东西。大大增加了我的知识
t
taseenb

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

$a = "whatever"; // any variable

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

这是这里的第一个好答案。以上所有内容都是 BS 和危险的,因为 ``` intval("4C775916") => 4``` 可能会给你带来一个讨厌的错误。
C
CogSciGradStudent

这是实现您正在寻找的功能。首先我们检查该值是否可以理解为数字,如果可以,我们将其转换为 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;
    }
}

k
klodoma

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

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


get_numeric(010); // int 8 get_numeric('010'); // int 10
P
Peter Mortensen

除了 Boykodev's answer,我还建议:

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

稍微想了想,我也可以建议除以 1 :)
这是一个重点! :) 顺便说一句,您的解决方案比上面所有的科学记数法都要好得多。谢谢你。
这个解决方案解决了我的问题。就我而言, $id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1; 而不是 $target_id_cron = (int)$id_cron - 1;
当我想将字符串更改为浮动 $num = '12,24' * 1 时出现此错误 A non well formed numeric value encountered。有什么建议吗?
@AgnesPalit - PHP 以盎格鲁为中心。仅将 . 识别为小数分隔符。试试 '12.24' * 1。虽然我个人更喜欢+ 0。加法而不是乘法。
D
Dragas

我一直在阅读答案,并没有看到有人提到 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] 范围内。

如果您要转换为浮动或加倍,也会发生同样的情况。 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 如何将字符串转换为相应的数字


这是一个非常好的答案。我做了一些工作并为相同的 tutes.in/php-caveats-int-float-type-conversion 编写了一些测试
is_numeric($str) 对此有所帮助。 (如两个较早的答案所示 - 所以“没有人提到最大的警告”并不十分准确 - 尽管我看到没有人详细解释这个问题。)
D
Dieter Gribnitz

这是我为自己简化事情而编写的一个函数:

它还返回布尔、整数、双精度和实数的速记版本。

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 将在检查类型之前转换数字字符串。

因此:

type("5", true) 将返回 int

type("3.7", true) 将返回浮点数

type("500") 将返回字符串

请小心,因为这是一种错误检查方法,您的实际变量仍将是一个字符串。如果需要,您需要将实际变量转换为正确的类型。我只需要它来检查数据库是否应该加载项目 ID 或别名,因此不会产生任何意外影响,因为无论如何它都会在运行时被解析为字符串。

编辑

如果您想检测对象是否是函数,请将这种情况添加到开关中:

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

r
rolodef

仅将数字乘以 1,以便将字符串转换为数字类型。

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

很公平,但是这个方法(和类似的技巧)已经列在这个问题的 24 个其他答案中——我看不到再次发布它的价值。
例如 stackoverflow.com/a/39832873/5411817 在 3 年前提出了相同的技巧。
为了使 SO 平台正常工作,现有的答案应该被投票,而不是重复。如果有错别字,请在帖子下方添加评论,或提出建议。 SO 平台的运作方式与论坛不同。但这是该平台价值的一部分。每个平台都有自己的优势。在这种情况下,您可以通过投票来增加价值。或者您可以评论其他参考/链接。另一方面,如果你有一个很棒的、改变游戏规则的解释,没有其他人提供,你可以添加一个新的答案,同时也支持和链接到以前的帖子。
P
Peter Mortensen

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

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

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


当然,在 PHP 中,乘法技巧的工作原理与加法技巧完全相同 - 具有完全相同的警告 - 所以没有任何特别的理由要求计算机进行乘法运算。无论如何,最干净的解决方案是 $var = +$str; - 身份运算符。
B
Benni

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

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

小心:这缺乏对“.123”、“123.”、“1.23e6”和其他可能的输入(“0x16”、...)等输入的处理。
M
MikelG

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

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

"your number string" / 1

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

这个支持哪些浏览器?
这是在服务器端完成的
哦,好的,但请问您可以在所有浏览器或某些浏览器中使用此代码吗?
嗯...正如我所说,此代码用于服务器端。问题在于 PHP,它是服务器端执行。
P
Peter Mortensen
$a = "10";

$b = (int)$a;

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


如果输入的数字是“7.2345”,我不能使用(int),那么我必须使用(float)。我需要的是一个通用的解决方案。
你总是可以使用双精度或浮点数。
P
Peter Mortensen

您可以使用:

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

D
Dominic Amal Joe F

简单地你可以这样写:

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

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
你确定吗?这不会将字符串转换为数字,而是将数组转换为 JSON 字符串
是的,@NicoHaase 如果数字是数组中的字符串格式,它将转换为数字。
A
Anuga

有一种方法:

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

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

使用 json_encode()json_decode() 的组合将其转换为“真实”形式。如果它是一个真正的 string 那么它会输出错误。

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

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

将输出:string(2) "Me" int(0) float(0)


毫无疑问是真的。但是荒谬的过度杀伤方式来解决几年前已经提供了简单解决方案的问题。 (很高兴您没有早点编写它 - 请参阅 very downvoted answer with same approach)。
a
aksu

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

$number = "1.234";

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

settype($number , "float");

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

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

PHP Documentation


P
Peter Mortensen

所有建议都会丢失数字类型。

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

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

u
user1657853

如果您事先不知道您是浮点数还是整数,并且字符串可能包含特殊字符(如空格、€ 等),并且可能包含超过 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;
}

就个人而言,我认为这很可疑。随便取一个垃圾字符串并在其中搜索一个数字,几乎可以肯定是不可取的。最好做 php 默认做的事情,即将(大多数)垃圾字符串转换为“0”。原因:更明显的是,如果意外的字符串到达您的方法 - 您只需得到 0(除非字符串以有效数字开头)。
@ToolmakerSteve 是的,这是有问题的,但至少在这个用例中我别无选择:我必须“按原样”显示包含在(不可修改)工作表中的字符串,同时使用符号等时间使用其中包含的数字。
好的,这是有道理的。如果字符串中散布着多个数字,你的答案会怎样?这种方法对于将电话号码仅转换为数字的代码有用吗?例如,用户输入 (123)456-7890,您想从中提取 1234567890?还是它找到第一个数字的想法,所以在我的示例中会导致 123
它返回完整的数字
Z
Zahid Gani
//Get Only number from string
$string = "123 Hello Zahid";
$res = preg_replace("/[^0-9]/", "", $string);
echo $res."<br>";
//Result 123

h
hackernewbie

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

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

第二行将值增加 1。


A
Andy

现在我们正处于一个严格/强类型在 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)

JSON 不是 PHP
@TV-C-1-5 不确定您要表达的意思?当然 JSON 不是 PHP。 PHP 提供了对 JSON 进行编码和解码的函数。同样,PHP 提供了对 base64 进行编码和解码的功能——这并不意味着 base64 就是 PHP。