Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用多个正负号将字符串转换为int?_Php_Integer_Signed - Fatal编程技术网

Php 如何使用多个正负号将字符串转换为int?

Php 如何使用多个正负号将字符串转换为int?,php,integer,signed,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 ... 为什么会发生这种情况?在这种情况下,正确的投法是什么? 非常感谢 您可以从字符串中提取数字。你能帮忙吗 $str='-1'; 预赛\d+!'$str$匹配; 打印$匹配项; 我不能10

我正在尝试将字符串转换为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'; 预赛\d+!'$str$匹配; 打印$匹配项;
我不能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;

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

代码:

输出:

int(1)
int(-33)
int(-444)
该模式背后的逻辑是首先匹配/删除1个或多个连续的+符号,或-符号后跟零个或多个+符号,后跟a-并吸收任何尾随的+符号。如果有任何附带的情况,我的模式不正确处理,请更新您的问题,并给我留下评论


p、 扩展我的第二个分支\+*是为了优化模式,这样就不必重新启动模式。它可以写为~\+\124;-\+*-~这样会稍微减轻眼球的压力

您是否只想从这些字符串中获取返回值1?或者你想让有符号的值都是-1吗?+-1应该是什么?布伦顿·莫斯:不,不仅仅是值1,它可以是任何数字。安德烈亚斯:我是从另一条线上得到的我不在乎你从哪里得到的,你想要什么?为什么你期望-12是12,但是-23是-23,这只是你评论中的一个输入错误,你的意思是-12是-12?抱歉,或者您希望它处理多个负片,以便将有符号的值转过来。。。而且preg_match_all也不是一个很好的选择。你能解释一下你的方法吗?您是否在更多的输入数据上尝试过它,以查看它是否有效?这会以与ltrim$str、“+-”相同的方式忽略符号,但这不是OP所需的逻辑。这个答案是不正确的。我确实投了你一票,因为这是一个坚实的解决方案,而且比我提出的方案要简单得多。尽管如此,这仅仅是因为它仍然不清楚,但是任何字母字符和结果都将是0。字母字符在符号序列之后的边缘情况是一种发明的边缘情况。在已发布的示例输入中,绝对没有字母存在的迹象。您是正确的,尽管也没有尾随+符号的迹象,但您处理了它们。。。为什么?这似乎是本案的合理可能性。如果它能让你高兴,我可以把它去掉,但这串符号似乎没有什么韵律或道理。不,不管怎样我都会帮你取下来的不用取,我仍然认为您的解决方案是坚实的,并认为额外的处理是很好的考虑,让我们承认一个不明确的要求,难以理解的用例,这就是为什么我试图处理的可能性,字符串可能包含的字符以外的数值和数学符号,只集中在第一个。实数序列及其可能的有符号符号的出现。你对这个问题的处理更加优雅,我向你和这个答案致敬。你能解释一下这个奇怪的算法是做什么的吗?为什么不使用更简单的方法来消除不相关的签名信息呢?证明此代码段没有提供预期的输出:Nico Haase,我只是想提供一个初始示例,说明如何解析包含数字的字符串,以及我认为可能是任何数量的未知有效数字的其他字符。发布时,OP的描述是模糊的,除了如何解析带有数字的字符串和一些示例预期输出之外,仍然没有明确的要求,这些输出没有解释,只是推断出来的。我不想只提供答案,而是想知道如何构建一个函数,可以完全做到这一点,或者修改为做额外或更少的事情。
int(1)
int(-33)
int(-444)