首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将整型或浮点型转换为数字的PHP字符串

将整型或浮点型转换为数字的PHP字符串
EN

Stack Overflow用户
提问于 2018-08-21 03:46:17
回答 4查看 181关注 0票数 0

如果一个数组中有两个字符串:

$x = array("int(100)", "float(2.1)");

有没有一种简单的方法将每个值读取为存储在内部的数字?

原因是我正在查看一个函数(不是我的),它有时接收int,有时接收浮点数。我无法控制它接收的数据。

function convertAlpha($AlphaValue) { 
    return((127/100)*(100-$AlphaValue));
}

它会在php中导致错误。

PHP通知:遇到格式不正确的数值

我想摆脱它。

我可以剥离这根线,看看它是什么,然后做一个整形/浮动,但我想知道是否有一个整洁的方法。

更新:

玩了一下,我有这样的想法:

函数convertAlpha($AlphaValue) {

$x = explode("(", $AlphaValue);
$y = explode(")", $x[1]);

if ($x[0] == "int") {
    $z = intval($y[0]);
}

if ($x[0] == "float") {
    $z = floatval($y[0]);
}

return((127/100)*(100-$z)); }

这是有效的,但它只是混乱。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-21 04:08:14

<?php

$x = array("int(100)", "float(2.1)");

$result = [];

foreach($x as $each_value){
    $matches = [];
    if(preg_match('/^([a-z]+)(\((\d+(\.\d+)?)\))$/',$each_value,$matches)){
        switch($matches[1]){
          case "int": $result[] = intval($matches[3]); break;
          case "float": $result[] = floatval($matches[3]);
        }
    }
}

print_r($result);

输出

Array
(
    [0] => 100
    [1] => 2.1
)
票数 3
EN

Stack Overflow用户

发布于 2018-08-21 03:57:27

最简单的方法就是在需要的时候创建数组,而不是

$x = array("int(100)", "float(2.1)");

您必须:

$x = [100, 2.1];

但由于这不是您想要的,您现在有两个选择。一种是使用eval(),例如:

$x = ['(int)100', '(float)2.1'];
foreach ($x as $v) {
    var_dump(eval("return ${v};"));
}

这将产生以下结果:

int(100)
double(2.1)

正如你注意到的,源数组有点不同,因为在PHP中没有像int()float()这样的函数,所以如果你决定使用eval(),你需要通过上面例子中所示的强制转换,或者使用现有的intval()floatval()函数,将字符串更改为有效的PHP代码。最后,您可以自己解析字符串(很可能使用preg_match()),检查自己的语法并转换为eval(),或者在您自己的代码中处理它,这通常比使用eval()更推荐。

票数 0
EN

Stack Overflow用户

发布于 2018-08-21 04:10:15

我的方法是使用正则表达式来确定两个单独的组的类型和值:

([a-z]+)\((\d*\.?\d*)\)

正则表达式捕获直到第一个(为止的字母数字字符。然后,它使用以下部分查找()之间的字符:\d*\.?\d*

正则表达式的digit部分接受如下输入:12.34.1212.123

$re = '/([a-z]+)\((\d*\.?\d*)\)/m';
$input_values = array('int(100)', 'float(2.1)');

foreach($input_values as $input) {
    preg_match_all($re, $input, $matches, PREG_SET_ORDER, 0);
    var_dump($matches);
}

这导致了下面的输出。如您所见,阵列的[1]插槽中包含类型,[2]插槽中包含编号

array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(8) "int(100)"
    [1]=>
    string(3) "int"
    [2]=>
    string(3) "100"
  }
}
array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(10) "float(2.1)"
    [1]=>
    string(5) "float"
    [2]=>
    string(3) "2.1"
  }
}

然后,您可以使用检查来执行转换,如下所示:

$value;
if(matches[1] === "int") {
    $value = intval($matches[2]);
} elseif (matches[1] === "float") {
    $value = floatval($matches[2]);
}

后面的代码仍然需要错误处理,但是您已经明白了。希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51937580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档