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

How to cast a string to int with multiple positive and negative signs?

我正在尝试将字符串转换为 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
...

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

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

$str = '--1';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);

我不是 100% 确定你的用例,但我敲了这个函数来尝试处理一个带数字的字符串,并 return 第一个带负符号支持的完整数字。

我确定你的用例是错误的,但你可以屠杀这个函数,但是你喜欢放弃负符号处理或者可能处理可能需要小数位进行检测的浮点数。

值得注意的是,为此甚至可能存在正则表达式。谁知道呢。

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;

要计算正号和负号以便忽略所有正号并且两个负号等于一个正号,您可以执行替换。

代码:(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)

该模式背后的逻辑是首先 match/remove 1 个或多个连续的 + 符号,或者一个 - 符号后跟零个或多个 + 后跟一个-(并吸收任何尾随 + 符号)。如果有任何我的模式无法正确处理的边缘情况,请更新您的问题并给我留言。

p.s。使用 \+* 扩展我的第二个分支是尝试优化模式,这样它就不必重新启动模式。它可以写成 ~\++|-\+*-~ 这样对眼球的压力会稍微小一些。 (Demo)