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


163

如果我有一个字符串

00020300504
00000234892839
000239074

我如何摆脱前导零,以便我只有这个

20300504
234892839
239074

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


这是三个单独的字符串,还是一个用换行符分隔的数字?在编辑您的问题时,我注意到您有<br>将数字分开的标签;它们实际上是您的字符串的一部分吗?
erisco 2011年

Answers:


458

ltrim

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

2
警告$ str:='0'。根据这个答案在我的答案中解决。
Mike Weir 2015年

为什么事情太复杂了?迈克是$ str + = 0; 如此处所述:nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan这不会回答这个问题,这并没有要求将字符串转换为整数。有关为什么这不是一个很好的解决方案,请参见Svisstack答案的评论。
lonesomeday

@lonesomeday,您应该在他提到的地方仔细阅读他的问题:“请注意,上面的数字是随机生成的。” 所以它们已经是整数了:)
Nabeel Khan

1
注意:这将把“ 0”变成“
Goose Goose 2016年

12
(string)((int)"00000234892839")

我只是尝试了一个(int) "00009384783473"(随机数),结果是2147483647。但是,如果将其强制转换为浮点数,则似乎可以正常工作。奇怪
JamesHalsall 2011年

手册说:“整数的大小取决于平台,尽管通常的最大值约为20亿(32位带符号)”
llamerr 2011年

1
不奇怪 php中的整数最多为2 ^ 31,即2147483647。对于更大的数字,您将不得不使用lonesomeday基于字符串的解决方案。
2011年

1
强制转换为浮点型似乎可行,但有时会出现舍入错误。
2011年

1
通过使用循环语句评估每个字符串的想法怎么样,当它到达非零数字(或字符串)时,它将获得该数字的索引并删除所有前面的零,然后回显以字符串开头的字符串与第一个非零值
Gerald

10

不知道为什么人们使用如此复杂的方法来实现如此简单的事情!和正则表达式?哇!

在这里,您可以找到最简单的方法(如此处所述:https : //nabtron.com/kiss-code/):

$a = '000000000000001';
$a += 0;

echo $a; // will output 1

2
这似乎是一个更简单的解决方案,但是它不能像其他答案一样处理任何大小的字符串。您正在从字符串转换为整数,然后又转换为字符串-更简单的是仅缩短字符串。
迈克·威尔

1
有趣,但是我不知道它是否是类型转换的最佳解决方案。
jonathanbell'3

1
请不要这样做...这就是PHP表现不佳的原因
Dan

9

与另一个建议相似,但不会消除实际的零:

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

或如建议的那样(从PHP 5.3开始),可以使用速记三元运算符:

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

1
$str = ltrim($str, '0') ?: '0'; -没有多余的调整请求。
mickmackusa

8

您可以在变量中添加“ +”,

例如:

$numString = "0000001123000";
echo +$numString;

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

如果在正则表达式的开头添加^运算符,则它是有效的解决方案。
Twojr

0

我用这种方式解决了。

它非常简单。仅传递一个字符串,将其删除为零的字符串开头。

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中看到了,不记得在哪里了。


-2

假设您要删除三个或多个零的连续符,并且您的示例是一个字符串:

    $test_str ="0002030050400000234892839000239074";
    $fixed_str = preg_replace('/000+/','',$test_str);

如果我的假设无效,则可以使正则表达式模式适合您的需求。

这有帮助吗?


1
不正确,抱歉。这也会从字符串的中间切掉'000'。
Filip Overtone歌手Rydlo,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.