Cách xóa tất cả các số 0 đứng đầu trong một chuỗi


163

Nếu tôi có một chuỗi

00020300504
00000234892839
000239074

Làm thế nào tôi có thể thoát khỏi các số 0 hàng đầu để tôi chỉ có cái này

20300504
234892839
239074

lưu ý rằng số trên được tạo ngẫu nhiên.


Đây có phải là ba chuỗi riêng biệt, hoặc một chuỗi với dòng mới phân tách từng số? Tôi nhận thấy khi chỉnh sửa câu hỏi của bạn rằng bạn có <br>các thẻ phân tách các số; chúng thực sự là một phần của chuỗi của bạn?
erisco

Câu trả lời:


458

ltrim:

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

2
Hãy cẩn thận $ str: = '0'. Địa chỉ trong câu trả lời của tôi, dựa trên câu trả lời này.
Mike Weir

Tại sao lại quá phức tạp? và mike nó $ str + = 0; như được giải thích ở đây: nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan Điều đó sẽ không trả lời câu hỏi, không yêu cầu chuyển đổi chuỗi thành số nguyên. Xem các bình luận về câu trả lời của Svisstack để biết tại sao đây không phải là một giải pháp tuyệt vời.
cô đơn

@lonesomeday bạn nên đọc kỹ câu hỏi của anh ấy, nơi anh ấy đề cập: "lưu ý rằng số ở trên được tạo ngẫu nhiên." vậy họ đã là số nguyên rồi :)
Nabeel Khan

1
Thận trọng: Điều này sẽ biến '0' thành ''
Ngỗng

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

Tôi chỉ thử một (int) "00009384783473"(số ngẫu nhiên) và kết quả của tôi là 2147483647. Tuy nhiên, nếu tôi sử dụng nó như một cái phao, thì nó có vẻ hoạt động tốt. Lạ
JamesHalsall

hướng dẫn sử dụng nói rằng "Kích thước của một số nguyên phụ thuộc vào nền tảng, mặc dù giá trị tối đa khoảng hai tỷ là giá trị thông thường (đó là 32 bit được ký)"
llamerr 23/211

1
Không lạ. Số nguyên trong php lên tới 2 ^ 31, tức là 2147483647. Đối với bất kỳ số lượng lớn hơn, bạn sẽ phải sử dụng giải pháp dựa trên chuỗi của lonesomeday.
awm

1
Truyền để nổi có thể hoạt động, nhưng tại một số điểm, bạn sẽ gặp lỗi vòng.
awm

1
Làm thế nào về ý tưởng đánh giá từng chuỗi bằng cách sử dụng câu lệnh lặp, rằng khi nó đến một chữ số không (hoặc chuỗi), nó sẽ lấy chỉ số của chữ số đó và thả tất cả các số 0 trước đó rồi lặp lại chuỗi bắt đầu với giá trị khác không đầu tiên ..
Gerald

10

Không biết tại sao mọi người lại sử dụng các phương pháp phức tạp để đạt được một điều đơn giản như vậy! Và regex? Ồ

Ở đây bạn đi, cách dễ nhất và đơn giản nhất (như được giải thích ở đây: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1

2
Đây có vẻ là một giải pháp đơn giản hơn, nhưng nó không xử lý bất kỳ kích thước chuỗi nào giống như các câu trả lời khác. Bạn đang chuyển đổi từ một chuỗi thành một số nguyên và sau đó trở lại thành một chuỗi - đơn giản hơn để chỉ rút ngắn chuỗi.
Mike Weir

1
Thú vị, nhưng tôi không biết liệu đó có phải là giải pháp tốt nhất với chuyển đổi loại không.
jonathanbell

1
Xin đừng làm điều này ... đây là lý do tại sao PHP có một đại diện xấu
Dan F.

9

Tương tự như một đề xuất khác, ngoại trừ sẽ không xóa sạch số 0 thực tế:

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

Hoặc như đã được đề xuất (kể từ PHP 5.3), toán tử tốc ký có thể được sử dụng:

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

1
$str = ltrim($str, '0') ?: '0'; - không có cuộc gọi cắt dự phòng.
mickmackusa

8

bạn có thể thêm "+" vào biến của mình,

thí dụ :

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

3

Regex đã được đề xuất, nhưng không chính xác:

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

đầu ra là:

4523423400023402340240

Bối cảnh trên Regex: ^tín hiệu bắt đầu của chuỗi và +dấu hiệu báo hiệu nhiều hơn hoặc không có dấu hiệu nào trước đó. Do đó, regex ^0+khớp với tất cả các số 0 ở đầu chuỗi.


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

2

Tôi không nghĩ preg numplace là câu trả lời .. chủ đề cũ nhưng chỉ tình cờ tìm kiếm điều này ngày hôm nay. ltrim và (int) casting là người chiến thắng.

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

Nếu bạn thêm toán tử ^ khi bắt đầu regex, thì đó là một giải pháp hợp lệ.
twicejr

0

Tôi đã sửa với cách này.

nó rất đơn giản. chỉ vượt qua một chuỗi loại bỏ bắt đầu của chuỗi.

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

-1

Ajay Kumar cung cấp tiếng vang đơn giản nhất + $ numString; Tôi sử dụng những thứ này:

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

Trên thực tế, bất kỳ hàm toán học nào cũng sẽ lấy số từ "chuỗi" và xử lý nó như vậy. Nó đơn giản hơn nhiều so với bất kỳ hàm regex hoặc hàm so sánh nào. Tôi thấy điều đó trong php.net, đừng nhớ ở đâu.


-2

Giả sử bạn muốn loại bỏ ba số không trở lên và ví dụ của bạn là một chuỗi:

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

Bạn có thể làm cho mẫu regex phù hợp với những gì bạn cần nếu các giả định của tôi bị tắt.

Giúp này?


1
Không chính xác, xin lỗi. Điều này cũng sẽ cắt '000' từ giữa chuỗi.
Filip OvertoneSinger Rydlo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.