Cara menghapus semua nol terkemuka dalam sebuah string


163

Jika saya punya string

00020300504
00000234892839
000239074

bagaimana saya bisa menyingkirkan nol terkemuka sehingga saya hanya akan memiliki ini

20300504
234892839
239074

perhatikan bahwa angka di atas dihasilkan secara acak.


Apakah ketiga string ini terpisah, atau satu string dengan baris baru memisahkan setiap angka? Saya perhatikan ketika mengedit pertanyaan Anda bahwa Anda memiliki <br>tag yang memisahkan angka-angka; apakah mereka sebenarnya bagian dari tali Anda?
erisco

Jawaban:


458

ltrim:

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

2
Peringatan $ str: = '0'. Ditujukan dalam jawaban saya, berdasarkan jawaban ini.
Mike Weir

mengapa terlalu rumit? dan mike itu $ str + = 0; seperti yang dijelaskan di sini: nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan Itu tidak akan menjawab pertanyaan, yang tidak meminta untuk mengubah string ke integer. Lihat komentar pada jawaban Svisstack untuk mengapa ini bukan solusi yang bagus.
lonesomeday

@lonesomeday Anda harus membaca pertanyaannya dengan cermat di mana ia menyebutkan: "perhatikan bahwa angka di atas dihasilkan secara acak." jadi mereka sudah bilangan bulat :)
Nabeel Khan

1
Perhatian: Ini akan mengubah '0' menjadi ''
Goose

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

Saya baru saja mencoba (int) "00009384783473"(angka acak) dan hasil saya adalah 2147483647. Namun jika saya melemparkannya sebagai pelampung, sepertinya berfungsi dengan baik. Strange
JamesHalsall

manual mengatakan bahwa "Ukuran integer bergantung pada platform, meskipun nilai maksimum sekitar dua miliar adalah nilai biasa (yang ditandatangani 32 bit)"
llamerr

1
Tidak aneh. Integer dalam php naik ke 2 ^ 31, yaitu 2147483647. Untuk angka yang lebih besar, Anda harus menggunakan solusi berbasis string lonesomeday.
awm

1
Casting to float mungkin terlihat berhasil, tetapi pada titik tertentu Anda akan mendapatkan kesalahan pembulatan.
awm

1
bagaimana dengan ide mengevaluasi masing-masing string dengan menggunakan pernyataan loop, bahwa ketika sampai ke angka nol (atau string), itu akan mendapatkan indeks dari digit itu dan menjatuhkan semua nol sebelumnya kemudian gema string yang dimulai dengan nilai bukan nol pertama ..
Gerald

10

Tidak tahu mengapa orang menggunakan metode yang begitu rumit untuk mencapai hal yang begitu sederhana! Dan regex? Wow!

Ini dia, cara termudah dan paling sederhana (seperti yang dijelaskan di sini: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1

2
Ini sepertinya solusi yang lebih sederhana, tetapi tidak menangani ukuran string apa pun seperti jawaban lainnya. Anda mengonversi dari string ke integer dan kemudian kembali sebagai string - lebih sederhana untuk hanya mempersingkat string.
Mike Weir

1
Menarik, tetapi saya tidak tahu apakah itu solusi terbaik dengan jenis konversi.
Jonathanbell

1
Tolong jangan lakukan ini ... ini sebabnya PHP mendapat reputasi buruk
Dan F.

9

Mirip dengan saran lain, kecuali tidak akan menghapus nol aktual:

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

Atau seperti yang disarankan (pada PHP 5.3), operator ternary steno dapat digunakan:

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

1
$str = ltrim($str, '0') ?: '0'; - tidak ada panggilan trim yang berlebihan.
mickmackusa

8

Anda dapat menambahkan "+" dalam variabel Anda,

contoh:

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

3

Regex sudah diusulkan, tetapi tidak dengan benar:

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

output kemudian:

4523423400023402340240

Latar belakang pada Regex: ^sinyal awal dari string dan +sinyal lebih atau tidak sama sekali dari tanda sebelumnya. Oleh karena itu, regex ^0+cocok dengan semua nol pada awal string.


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

2

Saya tidak berpikir preg_replace adalah jawabannya .. utas lama tetapi kebetulan mencari ini hari ini. Hanya casting dan int adalah pemenangnya.

<?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

Jika Anda menambahkan operator ^ di awal regex, itu adalah solusi yang valid.
twicejr

0

Saya Tetap dengan cara ini.

ini sangat sederhana. hanya melewatkan string, hilangkan nol mulai dari string.

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

-1

Ajay Kumar menawarkan gema paling sederhana + $ numString; Saya menggunakan ini:

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

Sebenarnya setiap fungsi matematika akan mengambil nomor dari "string" dan memperlakukannya seperti itu. Ini jauh lebih sederhana daripada fungsi regex atau komparatif. Saya melihat itu di php.net, tidak ingat di mana.


-2

Dengan asumsi Anda ingin run-on dari tiga nol atau lebih dihapus dan contoh Anda adalah satu string:

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

Anda dapat membuat pola regex sesuai dengan yang Anda butuhkan jika asumsi saya tidak aktif.

Bantuan ini?


1
Salah, maaf Ini juga akan memotong '000' dari tengah string.
Filip OvertoneSinger Rydlo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.