【问题标题】:How to remove all leading zeroes in a string如何删除字符串中的所有前导零
【发布时间】:2011-07-03 04:35:17
【问题描述】:

如果我有一个字符串

00020300504
00000234892839
000239074

我怎样才能去掉前导零,这样我就只有这个了

20300504
234892839
239074

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

【问题讨论】:

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

标签: php string


【解决方案1】:

一个简短的技巧可以是使用 round() 它将删除前导零。

echo round('00020300504'); //20300504

【讨论】:

    【解决方案2】:

    类似于另一个建议,除了不会消除实际的零:

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

    或者按照建议(从 PHP 5.3 开始),可以使用速记三元运算符:

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

    【讨论】:

    • $str = ltrim($str, '0') ?: '0'; -- 没有多余的修剪调用。
    【解决方案3】:

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

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

    然后输出是:

    4523423400023402340240
    

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

    【讨论】:

    • preg_replace() expects at least 3 parameters, 2 given
    【解决方案4】:

    我用这种方式解决了。

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        示例:

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

        【讨论】:

          【解决方案7】:

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

          给你,最简单最简单的方法(如下所述:https://nabtron.com/kiss-code/):

          $a = '000000000000001';
          $a += 0;
          
          echo $a; // will output 1
          

          【讨论】:

          • 这似乎是一个更简单的解决方案,但它不像其他答案那样处理任何大小的字符串。您正在从字符串转换为整数,然后再转换为字符串 - 更简单地缩短字符串。
          • 有趣,但我不知道这是否是类型转换的最佳解决方案。
          • 请不要这样做...这就是 PHP 得到不好代表的原因
          • 仅仅因为你可以做某事,并不意味着你应该这样做。这段代码在表面上没有任何意义,即使它在技术上是有效的,这只会让你的代码更难被其他开发人员理解。使用 ltrim() 并没有什么复杂的地方,这是一个专门为此目的而设计的含义明确的函数。
          【解决方案8】:

          我不认为 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
          

          【讨论】:

          • 如果您在正则表达式的开头添加 ^ 运算符,那么它是一个有效的解决方案。
          【解决方案9】:

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

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

          如果我的假设不成立,您可以使正则表达式模式符合您的需要。

          这个帮助?

          【讨论】:

          • 不正确,抱歉。这也会从字符串中间剪掉“000”。
          【解决方案10】:

          ltrim:

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

          【讨论】:

          • 警告 $str := '0'。根据这个答案在我的答案中解决。
          • 为什么要把事情复杂化?迈克它是 $str += 0;如此处所述:nabtron.com/kiss-code
          • @NabeelKhan 这不会回答问题,not 要求将字符串转换为整数。请参阅 Svisstack 的答案中的 cmets,了解为什么这不是一个很好的解决方案。
          • @lonesomeday 你应该仔细阅读他提到的问题:“请注意,上面的数字是随机生成的。”所以它们已经是整数了:)
          • 注意:这会将'0'变成''
          【解决方案11】:
          (string)((int)"00000234892839")
          

          【讨论】:

          • 我刚刚尝试了(int) "00009384783473"(随机数),结果是 2147483647。但是,如果我将其转换为浮点数,它似乎可以正常工作。奇怪
          • 手册说“整数的大小取决于平台,尽管通常值约为 20 亿的最大值(即 32 位有符号)”
          • 并不奇怪。 php 中的整数最高可达 2^31,即 2147483647。对于更大的数字,您将不得不使用 lonesomeday 的基于字符串的解决方案。
          • 强制转换为浮点数似乎可行,但在某些时候您会遇到舍入错误。
          • 使用循环语句评估每个字符串的想法怎么样,当它到达非零数字(或字符串)时,它将获取该数字的索引并删除所有前面的零然后回显以第一个非零值开头的字符串..
          猜你喜欢
          • 1970-01-01
          • 2017-07-10
          • 2011-04-09
          • 2012-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多