如何去除字符串中所有前导零

186
如果我有一个字符串
00020300504
00000234892839
000239074

如何去除前导零,使得只剩下这个:

20300504
234892839
239074

请注意,上面的数字是随机生成的。


这三个是独立的字符串,还是一个字符串,每个数字之间用换行符分隔?我注意到在编辑您的问题时,您使用了<br>标签来分隔数字;它们实际上是您字符串的一部分吗? - erisco
11个回答

520

ltrim函数:

$str = ltrim($str, '0');

2
注意事项 $str := '0'。根据这个答案,已经得到解决。 - Mike Weir
为什么要过度复杂化呢?Mike,就像这里所解释的那样,它应该是$str += 0;。https://nabtron.com/kiss-code/ - Nabeel Khan
@NabeelKhan 这并不能回答问题,因为问题并没有要求将字符串转换为整数。请参考Svisstack答案下的评论,了解为什么这不是一个好的解决方案。 - lonesomeday
@lonesomeday,你应该仔细阅读他的问题,他提到:“请注意上面的数字是随机生成的。”所以它们已经是整数了 :) - Nabeel Khan
3
注意:这将把“0”转换为“”。 - Goose
显示剩余2条评论

14
(string)((int)"00000234892839")

我刚试了一个(int) "00009384783473"(随机数),结果是2147483647。但如果我将其转换为浮点数,则似乎可以正常工作。很奇怪。 - JamesHalsall
手册表示:“整数的大小取决于平台,尽管约为20亿是通常值(即32位有符号整数的最大值)。” - llamerr
1
不奇怪。在php中,整数的范围是从2^31到2147483647。对于更大的数字,你将需要使用lonesomeday的基于字符串的解决方案。 - awm
1
强制转换为浮点数可能看起来有效,但在某些时候你会遇到舍入误差。 - awm
1
用循环语句评估每个字符串的想法如何?当它到达非零数字(或字符串)时,它将获取该数字的索引并删除所有前导零,然后回显以第一个非零值开头的字符串。 - Gerald
我不会在一个简单的字符串问题中引入转换和浮点算术。lonesomeday的解决方案将更快 - 在我的测试中比(string)(float)转换快60-70%。 - Czechnology

12
你可以在变量中添加“+”号,
例如:
$numString = "0000001123000";
echo +$numString;

10

与另一个建议类似,但不会覆盖实际的零值:

if (ltrim($str, '0') != '') {
    $str = ltrim($str, '0');
} else {
    $str = '0';
}

或者,就像建议的那样(从PHP 5.3开始),可以使用简写的三元运算符:

$str = ltrim($str, '0') ?: '0'; 

2
$str = ltrim($str, '0') ?: '0'; -- 避免冗余的修剪调用。 - mickmackusa

9
我不知道为什么人们要使用如此复杂的方法来实现这么简单的事情!而且正则表达式?哇!
以下是最简单和最易懂的方法(如此处所述:https://nabtron.com/kiss-code/):
$a = '000000000000001';
$a += 0;

echo $a; // will output 1

2
这似乎是一个更简单的解决方案,但它不能像其他答案那样处理任何大小的字符串。你正在将字符串转换为整数,然后再转回字符串 - 更简单的方法是缩短字符串。 - Mike Weir
1
有趣,但我不确定它是否是最佳的解决方案,因为它涉及类型转换。 - jonathanbell
3
请不要这样做...这就是为什么 PHP 招致了不好的评价。 - Dan F.
仅仅因为你能够做某事,并不意味着你应该这样做。尽管从技术上讲这段代码可以工作,但表面上它毫无意义,这只会使另一个开发人员更难理解你的代码。使用ltrim()并没有什么复杂的地方,它是一个具有明确含义的函数,专门为此目的而设计。 - BadHorsie

3

正则表达式已经被提出,但并不正确:

<?php
    $number = '00000004523423400023402340240';
    $withoutLeadingZeroes = preg_replace('/^0+/', '', $number)
    echo $withoutLeadingZeroes;
?>

输出结果如下:

4523423400023402340240

正则表达式背景: ^ 表示字符串的开头,+ 表示前面的字符出现一次或多次。因此,正则表达式 ^0+ 匹配字符串开头的所有零。


preg_replace() expects at least 3 parameters, 2 given - TarangP

2

我认为preg_replace不是答案...虽然这个帖子很老,但今天恰好碰到了这个问题。ltrim和(int)强制类型转换是最佳选择。

<?php
 $numString = "0000001123000";
 $actualInt = "1123000";

 $fixed_str1 = preg_replace('/000+/','',$numString);
 $fixed_str2 = ltrim($numString, '0');
 $fixed_str3 = (int)$numString;

 echo $numString . " Original";
 echo "<br>"; 
 echo $fixed_str1 . " Fix1";
 echo "<br>"; 
 echo $fixed_str2 . " Fix2";
 echo "<br>";
 echo $fixed_str3 . " Fix3";
 echo "<br>";
 echo $actualInt . " Actual integer in string";

 //output

 0000001123000 Origina
 1123 Fix1
 1123000 Fix2
 1123000 Fix3
 1123000 Actual integer in tring

如果您在正则表达式的开头添加^运算符,则是一个有效的解决方案。 - twicejr

0
一个简短的技巧是使用 round() 函数,它可以去掉前导零。
echo round('00020300504'); //20300504

-1

我用这种方法解决了问题。

非常简单,只需传递一个字符串,它会删除字符串开头的零。

function removeZeroString($str='')
{
    while(trim(substr($str,0,1)) === '0')
    {
        $str = ltrim($str,'0');
    }
    return $str;
}

-1

Ajay Kumar 提供了最简单的 echo +$numString; 我使用这些:

echo round($val = "0005");
echo $val = 0005;
    //both output 5
echo round($val = 00000648370000075845);
echo round($val = "00000648370000075845");
    //output 648370000075845, no need to care about the other zeroes in the number
    //like with regex or comparative functions. Works w/wo single/double quotes

实际上,任何数学函数都会从“字符串”中获取数字并进行处理。这比任何正则表达式或比较函数都要简单得多。我在php.net上看到过,不记得具体位置了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接