Як видалити всі провідні нулі в рядку


163

Якщо у мене є рядок

00020300504
00000234892839
000239074

як я можу позбутися провідних нулів, щоб у мене було тільки це

20300504
234892839
239074

зауважимо, що вищевказане число генерувалося випадковим чином.


Це три окремі рядки або один рядок з новими рядками, що розділяють кожне число? Я помітив, редагуючи ваше запитання, що у вас є <br>теги, що розділяють числа; вони насправді є частиною вашої струни?
erisco

Відповіді:


458

ltrim:

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

2
Caveat $ str: = '0'. Звернувшись до моєї відповіді, грунтуючись на цій відповіді.
Майк Вейр

чому надскладні речі? і Майк це $ str + = 0; як пояснено тут: nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan Це не відповість на запитання, яке не просить перетворити рядок у ціле число. Дивіться коментарі до відповіді Svisstack, чому це не таке чудове рішення.
самотній день

@lonesomeday слід уважно прочитати його запитання, де він згадує: "зауважте, що число вище було створене випадковим чином". тож вони вже цілі числа :)
Набіл Хан

1
Застереження: це перетворить "0" на ""
Гусак

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

Я щойно спробував (int) "00009384783473"(випадкове число), і мій результат був 2147483647. Якщо я подаю це як плаваючий знак, однак, здається, це нормально. Дивні
JamesHalsall

Посібник говорить, що "Розмір цілого числа залежить від платформи, хоча максимальне значення близько двох мільярдів - це звичайне значення (це 32 біти підписано)"
llamerr

1
Не дивно. Цілі числа в php доходять до 2 ^ 31, що становить 2147483647. Для будь-яких більших чисел вам доведеться скористатися рядковим рішенням lonesomeday.
awm

1
Кастинг до плаву може здатися спрацьовим, але в якийсь момент у вас з’являться помилки з обтиском.
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

Передумови на Regex: ^сигнали, що починаються з рядка, і +знак сигналізують більше або жоден попередній знак. Тому регулярний вираз ^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

Аджай Кумар пропонує найпростіший ехо + $ 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 OvertoneSinger Rydlo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.