如何将具有多个正负符号的字符串转换为整数?

时间:2019-01-22 08:11:56

标签: php integer signed

我正在尝试将字符串转换为int。一切正常,但这里有一个小问题

echo (int)"--12"; //return 0, i want 12
echo (int)"---23";//return 0, i want -23
echo (int)"+-99"; //return 0, i want -99
...

为什么会发生这种情况?在这种情况下,正确的投射方法是什么? 非常感谢!

3 个答案:

答案 0 :(得分:2)

要评估正负号以使所有正号都被忽略并且两个负号等于正号,则可以执行替换操作。

代码:(Demo

$signed_number_strings = ["--1", "---33", "+-444"];

foreach ($signed_number_strings as $string) {
    var_dump((int)preg_replace('~\++|-\+*-\+*~', '', $string));
}

输出:

int(1)
int(-33)
int(-444)

该模式背后的逻辑是先匹配/删除1个或多个连续的+符号,或者先匹配/删除一个-符号,然后是零个或多个+,然后再加上{{1} }(并吸收所有结尾的-符号)。如果有任何我的模式无法正确处理的边缘情况,请更新您的问题并给我评论。

p.s。用+扩展第二个分支是一种尝试优化模式的尝试,因此不必重新启动模式。可以将其写为\+*,这样可以减轻眼球的负担。 (Demo

答案 1 :(得分:-1)

对于您的用例,我不是100%肯定的,但是我敲了这个函数,尝试处理带有数字的字符串,并返回带有负号支持的第一个完整数字。

我确定您的用例有误,但是您可以屠杀此功能,但是您希望删除负号处理或可能需要检测小数点的浮点数。

值得一提的是,正则表达式可能甚至存在。

function intvaljunk($string) {
    $boolSignedNegative = false;
    $intIntStart = null;
    $intIntEnd = null;
    foreach (str_split($string) as $index => $char) {
        if (is_numeric($char)) {
            $boolSignedNegative = (
                $boolSignedNegative === false
                && $index > 0
                && is_null($intIntStart)
                && $string[$index - 1] === '-'
                    ? true
                    : $boolSignedNegative
            );
            $intIntStart = is_null($intIntStart) ? $index : $intIntStart;
            $intIntEnd = is_null($intIntStart) ? $intIntEnd : $index;
        } else if (!is_null($intIntStart) && !is_null($intIntStart)) {
            break;
        }
    }

    return (
        !is_null($intIntStart) && !is_null($intIntStart)
        ? intval(($boolSignedNegative ? '-' : '') . substr($string, $intIntStart, ($intIntEnd - $intIntStart) + 1))
        : null
    );
}

echo intvaljunk("--1") . PHP_EOL;
echo intvaljunk("---1") . PHP_EOL;
echo intvaljunk("+-1") . PHP_EOL;
echo intvaljunk("+-14991abc667") . PHP_EOL;

答案 2 :(得分:-2)

您可以从string中提取数字。可以帮忙吗?!

select * from [test].[dbo].[alertdetails] as a
inner join 
(
select  a.[alertType] ,a.[alertTypeId] ,a.[macId] , MAX(a.timeStamp) as t  
from [test].[dbo].[alertdetails] as a 
group by a.[alertType] ,a.[alertTypeId] ,a.[macId]
) as b
on a.timeStamp=b.t and a.alertType=b.alertType and a.alertTypeId=b.alertTypeId