Как удалить все ведущие нули в строке


163

Если у меня есть строка

00020300504
00000234892839
000239074

как я могу избавиться от ведущих нулей, чтобы у меня было только это

20300504
234892839
239074

обратите внимание, что число выше было сгенерировано случайным образом.


Это три отдельные строки или одна строка с символами новой строки, разделяющими каждое число? При редактировании вашего вопроса я заметил, что у вас есть <br>теги, разделяющие числа; они на самом деле являются частью вашей строки?
Эриско

Ответы:


458

ltrim:

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

2
Предостережение $ str: = '0'. Адресовано в моем ответе, основанном на этом ответе.
Майк Вейр

зачем усложнять вещи? и майк это $ str + = 0; как объяснено здесь: nabtron.com/kiss-code
Набиль Хан

@NabeelKhan Это не ответило бы на вопрос, который не просит преобразовать строку в целое число. Посмотрите комментарии к ответу Svisstack, чтобы узнать, почему это не такое удачное решение.
Одинокий день

@ loneomeday, вы должны внимательно прочитать его вопрос, где он упоминает: «обратите внимание, что число выше было сгенерировано случайным образом». так что они уже целые числа :)
Набиэль Хан

1
Внимание: это превратит '0' в ''
Goose

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

Я только что попробовал (int) "00009384783473"(случайное число), и мой результат был 2147483647. Однако, если я разыграю его как число с плавающей точкой, это, кажется, работает хорошо Странно
JamesHalsall

Руководство говорит, что «Размер целого числа зависит от платформы, хотя максимальное значение около двух миллиардов является обычным значением (это 32-
битная

1
Не странно Целые числа в php доходят до 2 ^ 31, то есть 2147483647. Для любых больших чисел вам придется использовать решение на основе строк lonesomeday.
AWM

1
Может показаться, что приведение к float работает, но в какой-то момент вы получите ошибки округления.
AWM

1
как насчет идеи оценки каждой строки с помощью оператора цикла, что, когда она получает ненулевую цифру (или строку), она получает индекс этой цифры и удаляет все предшествующие нули, а затем выводит строку, которая начинается с первым ненулевым значением ..
Джеральд

10

Не знаю, почему люди используют такие сложные методы для достижения такой простой вещи! И регулярное выражение? Вот Это Да!

Вот, пожалуйста, самый простой и простой способ (как описано здесь: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1

2
Это кажется более простым решением, но оно не обрабатывает строки любого размера, как это делают другие ответы. Вы преобразуете строку в целое число, а затем возвращаете ее в виде строки - проще просто укоротить строку.
Майк Вейр,

1
Интересно, но я не знаю, является ли это лучшим решением с преобразованиями типов.
jonathanbell

1
Пожалуйста, не делайте этого ... вот почему PHP получает плохую репутацию
Дэн Ф.

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


3

Regex был предложен уже, но не правильно:

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

вывод тогда:

4523423400023402340240

Фон на регулярном выражении: ^сигнализирует начало строки, а +знак сигнализирует о большем или отсутствии предшествующего знака. Следовательно, регулярное выражение ^0+соответствует всем нулям в начале строки.


preg_replace() expects at least 3 parameters, 2 given
ТарангП

2

Я не думаю, что preg_replace - это ответ .. старая ветка, но я просто случайно нашёл это сегодня. Итрим и (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

Если вы добавите оператор ^ в начале регулярного выражения, это будет правильным решением.
дважды

0

Я исправлен таким образом.

это очень просто. только передать строку, удалить нулевое начало строки.

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

-1

Аджай Кумар предлагает простейшее эхо + $ 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' от середины строки.
Филип ОбертонеСингер Ридло
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.