วิธีลบศูนย์นำหน้าทั้งหมดในสตริง


163

ถ้าฉันมีสตริง

00020300504
00000234892839
000239074

ฉันจะกำจัด zeroes ชั้นนำได้อย่างไรเพื่อที่ฉันจะได้มีสิ่งนี้

20300504
234892839
239074

โปรดทราบว่าหมายเลขข้างต้นถูกสร้างแบบสุ่ม


สามสายเหล่านี้แยกกันหรือหนึ่งสายที่มีการขึ้นบรรทัดใหม่คั่นแต่ละหมายเลข? ฉันสังเกตเห็นเมื่อแก้ไขคำถามของคุณว่าคุณมี<br>แท็กคั่นตัวเลข พวกเขาเป็นส่วนหนึ่งของสตริงของคุณหรือไม่
erisco

คำตอบ:


458

ltrim:

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

2
Caveat $ str: = '0' พูดถึงคำตอบของฉันตามคำตอบนี้
Mike Weir

ทำไมสิ่งที่ซับซ้อนเกินไป? และไมค์มัน $ str + = 0; ตามที่อธิบายไว้ที่นี่: nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan ที่จะไม่ตอบคำถามซึ่งไม่ขอให้แปลงสตริงเป็นจำนวนเต็ม ดูความคิดเห็นเกี่ยวกับคำตอบของ Svisstack เพราะเหตุใดสิ่งนี้จึงไม่ใช่ทางออกที่ดี
lonesomeday

@lonesomeday คุณควรอ่านคำถามของเขาอย่างรอบคอบซึ่งเขากล่าวถึง: "โปรดทราบว่าหมายเลขข้างต้นถูกสร้างขึ้นแบบสุ่ม" ดังนั้นพวกเขาจึงจำนวนเต็มอยู่แล้ว :)
Nabeel ข่าน

1
ข้อควรระวัง: สิ่งนี้จะเปลี่ยน '0' เป็น ''
Goose

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

ฉันเพิ่งลอง(int) "00009384783473"(หมายเลขสุ่ม) และผลลัพธ์ของฉันคือ 2147483647 ถ้าฉันโยนมันแบบลอยอย่างไรก็ตามดูเหมือนว่าจะใช้ได้ Strange
JamesHalsall

ด้วยตนเองกล่าวว่า "ขนาดของจำนวนเต็มขึ้นอยู่กับแพลตฟอร์มแม้ว่าค่าสูงสุดประมาณสองพันล้านเป็นค่าปกติ (นั่นคือการลงนาม 32 บิต)"
llamerr

1
ไม่แปลก จำนวนเต็มใน php มีค่าสูงสุด 2 ^ 31 ซึ่งเท่ากับ 2147483647 สำหรับจำนวนที่มากกว่านั้นคุณจะต้องใช้วิธีการแก้ปัญหาแบบอิงสตริงของ lonesomeday
awm

1
การส่งไปลอยอาจดูเหมือนใช้งานได้ แต่ในบางจุดคุณจะได้รับข้อผิดพลาดในการปัดเศษ
awm

1
วิธีการเกี่ยวกับแนวคิดของการประเมินสตริงแต่ละตัวโดยใช้คำสั่งวนรอบว่าเมื่อมันมาถึงไม่ใช่ศูนย์หลัก (หรือสตริง) มันจะได้รับดัชนีของตัวเลขนั้นและปล่อยศูนย์ก่อนหน้าทั้งหมดแล้วสะท้อนสตริงที่เริ่มต้น ด้วยค่าที่ไม่ใช่ศูนย์แรก ..
เจอราลด์

10

ไม่รู้ว่าทำไมผู้คนถึงใช้วิธีการที่ซับซ้อนเพื่อให้ได้สิ่งที่ง่าย! และ regex? ว้าว!

ที่นี่คุณไปวิธีที่ง่ายที่สุดและง่ายที่สุด (ดังที่อธิบายไว้ที่นี่: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1

2
ดูเหมือนว่าจะเป็นวิธีที่ง่ายกว่า แต่ก็ไม่ได้จัดการกับขนาดของสตริงเหมือนกับคำตอบอื่น ๆ คุณกำลังแปลงจากสตริงเป็นจำนวนเต็มแล้วกลับมาเป็นสตริง - ง่ายกว่าที่จะย่อสตริงให้สั้นลง
Mike Weir

1
น่าสนใจ แต่ฉันไม่รู้ว่ามันเป็นทางออกที่ดีที่สุดกับการแปลงประเภทหรือไม่
โจนาธานเบลล์

1
โปรดอย่าทำเช่นนี้ ... นี่คือสาเหตุที่ PHP ได้รับตัวแทนที่ไม่ดี
Dan F.

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: ^สัญญาณเริ่มต้นของสตริงและ+สัญญาณส่งสัญญาณมากกว่าหรือไม่มีสัญญาณก่อนหน้า ดังนั้น 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

หากคุณเพิ่มตัวดำเนินการ ^ ที่จุดเริ่มต้นของ regex มันเป็นโซลูชันที่ถูกต้อง
doublejr

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

จริง ๆ แล้วฟังก์ชันทางคณิตศาสตร์ใด ๆ จะใช้ตัวเลขจาก "สตริง" และปฏิบัติเช่นนั้น มันง่ายกว่า regex หรือฟังก์ชั่นเปรียบเทียบ ฉันเห็นสิ่งนั้นใน php.net จำไม่ได้ว่าอยู่ที่ไหน


-2

สมมติว่าคุณต้องการให้ลบศูนย์อย่างน้อยสามศูนย์และตัวอย่างของคุณคือหนึ่งสตริง:

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

คุณสามารถทำให้รูปแบบ regex เหมาะสมกับสิ่งที่คุณต้องการหากสมมติฐานของฉันปิด

ความช่วยเหลือนี้หรือไม่?


1
ไม่ถูกต้องขออภัย สิ่งนี้จะตัด '000' ออกจากกลางสตริง
Filip OvertoneSinger Rydlo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.