Định dạng một số với các số 0 đứng đầu trong PHP


600

Tôi có một biến chứa giá trị 1234567.

Tôi muốn nó chứa chính xác 8 chữ số 01234567.

Có một chức năng PHP cho điều đó?

Câu trả lời:


1212

Sử dụng sprintf:

sprintf('%08d', 1234567);

Ngoài ra, bạn cũng có thể sử dụng str_pad:

str_pad($value, 8, '0', STR_PAD_LEFT);

54
Chỉ muốn thêm: str_pad không phải là một tùy chọn có số âm
wtf8_decode

6
Chỉ cần thêm vào đầu những gì wtf8_decode đã nói; Số âm sẽ không có số 0 đứng đầu và chúng không phải là số dương. tức là 08 sẽ được viết như một ngày hoặc một cái gì đó mong đợi một số có hai chữ số dương (mã sắp xếp tài khoản ngân hàng, v.v.). Vui lòng sửa cho tôi nếu tôi sai, nhưng theo tôi biết, không có trường hợp thực tế nào về việc yêu cầu số 0 đứng đầu trên một giá trị âm?
chàngver4mk

3
Muốn thêm vào sprintf('%+03d:00 UTC',$i)đó $ilà -12 đến 12, sẽ in + hoặc - khi cần và cũng sẽ đặt các số 0 đứng đầu cho các số nhỏ hơn 2 chữ số. Tuyệt vời để tạo một múi giờ SELECTtrong HTML.
Volomike

2
đối với phiên bản hiện tại (7.1) và thấp hơn sprintf( 3v4l.org/junvv/perf#output ) nhanh hơn một chút so với str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev

Khi nào một số âm có thể yêu cầu một số 0 đứng đầu ... Một bộ đếm nâng có ba chữ số? T-010, T-009, T-008, v.v.
TRT 1968

83

Cho rằng giá trị tính bằng $ value:

  • Để lặp lại nó:

    printf("%08d", $value);

  • Để có được nó:

    $formatted_value = sprintf("%08d", $value);

Điều đó sẽ làm các trick


32

Khi tôi cần 01 thay vì 1, những điều sau đây có hiệu quả với tôi:

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);


19

Mặc dù tôi không thực sự chắc chắn những gì bạn muốn làm bạn có thể nhìn cho sprintf .

Điều này sẽ:

$value = sprintf( '%08d', 1234567 );

16

sprintf là những gì bạn cần.

EDIT ( bằng cách nào đó được yêu cầu bởi các downvote ), từ trang được liên kết ở trên, đây là một mẫu "số nguyên không đệm" mẫu:

<?php
    $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>

3
Sẽ tốt hơn với một ví dụ hoặc giải thích nhiều hơn ngoài việc đơn giản là liên kết trang man cho sprintf ().
jharrell

13

Câu trả lời đơn giản

$p = 1234567;
$p = sprintf("%08d",$p);

Tôi không chắc làm thế nào để diễn giải lời bình luận rằng "Nó sẽ không bao giờ quá 8 chữ số" và nếu nó đề cập đến đầu vào hoặc đầu ra. Nếu nó đề cập đến đầu ra, bạn sẽ phải có một lệnh gọi () bổ sung để cắt chuỗi.

Để cắt 8 chữ số đầu tiên

$p = substr(sprintf('%08d', $p),0,8);

Để cắt 8 chữ số cuối

$p = substr(sprintf('%08d', $p),-8,8);

7

Nếu các số đầu vào luôn có 7 hoặc 8 chữ số, bạn cũng có thể sử dụng

$str = ($input < 10000000) ? 0 . $input : $input;

Tôi đã chạy một số thử nghiệm và nhận được rằng nó sẽ tăng nhanh gấp đôi str_padhoặc sprintf.
Nếu đầu vào có thể có độ dài bất kỳ, thì bạn cũng có thể sử dụng

$str = substr('00000000' . $input, -8);

Cái này không nhanh như cái kia, nhưng cũng nên nhanh hơn một chút so với str_padsprintf.

Btw: Bài kiểm tra của tôi cũng nói rằng sprintf nhanh hơn một chút str_pad. Tôi đã thực hiện tất cả các thử nghiệm với PHP 5.6.

Chỉnh sửa: Mặc dù substrphiên bản dường như vẫn còn rất nhanh (PHP 7.2), nó cũng bị hỏng trong trường hợp đầu vào của bạn có thể dài hơn độ dài bạn muốn đệm. Ví dụ: bạn muốn đệm đến 3 chữ số và đầu vào của bạn có 4 chữ số substr('0000' . '1234', -3) = '234'sẽ chỉ dẫn đến 3 chữ số cuối


Cảm ơn, tôi thích biến thể của bạn nhưng nghĩ rằng nó phải là $ str = (strlen ($ input) <8)? 0. $ đầu vào: $ đầu vào;
JMX

@JMX Trên thực tế, cả hai cách đều hoạt động tốt. (Bên cạnh sự mất tích của $tôi, tôi vừa sửa)
AbcAeffchen

1

Tôi đã viết hàm đơn giản này để tạo định dạng này: 01:00:03

Giây luôn được hiển thị (ngay cả khi không). Biên bản được hiển thị nếu lớn hơn 0 hoặc nếu cần nhiều giờ hoặc ngày. Giờ được hiển thị nếu lớn hơn 0 hoặc nếu cần ngày. Ngày được hiển thị nếu lớn hơn không.

function formatSeconds($secs) {
    $result = '';

    $seconds = intval($secs) % 60;
    $minutes = (intval($secs) / 60) % 60;
    $hours = (intval($secs) / 3600) % 24;
    $days = intval(intval($secs) / (3600*24));

    if ($days > 0) {
        $result = str_pad($days, 2, '0', STR_PAD_LEFT) . ':';
    } 

    if(($hours > 0) || ($result!="")) {
        $result .= str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
    } 

    if (($minutes > 0) || ($result!="")) {
        $result .= str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':';
    } 

    //seconds aways shown
    $result .= str_pad($seconds, 2, '0', STR_PAD_LEFT); 

    return $result;

} //funct

Ví dụ:

echo formatSeconds(15); //15
echo formatSeconds(100); //01:40
echo formatSeconds(10800); //03:00:00 (mins shown even if zero)
echo formatSeconds(10000000); //115:17:46:40 

0
$no_of_digit = 10;
$number = 123;

$length = strlen((string)$number);
for($i = $length;$i<$no_of_digit;$i++)
{
    $number = '0'.$number;
}

echo $number; ///////  result 0000000123

-1

Điều này hoạt động hoàn hảo:

$number = 13246;
echo sprintf( '%08d', $number );

3
Đây dường như chỉ là một sự lặp lại của các câu trả lời hiện có.
Pang

-1

Bạn luôn có thể lạm dụng kiểu tung hứng:

function zpad(int $value, int $pad): string {
    return substr(1, $value + 10 ** $pad);
}

Công việc này sẽ không như mong đợi nếu một trong hai 10 ** pad > INT_MAXhoặc value >= 10 * pad.


-2
function duration($time){

    $hours = '';
    $minutes = '00:';
    $seconds = '00';

    if($time >= 3600){
        //0 - ~ hours
        $hours    = floor($time / 3600);
        $hours    = str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
        $time     = $time % 3600;
    }

    if($time >= 60){
        //0 - 60 minute     
        $minutes  = floor($time / 60);
        $minutes  = str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':';
        $time     = $time % 60; 
    }

    if($time){
        //0 - 60 second
        $seconds  = str_pad($time, 2, '0', STR_PAD_LEFT);       
    }

    return $hours . $minutes . $seconds;

}

echo duration(59); // 00:59
echo duration(590); // 09:50
echo duration(5900); // 01:38:20
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.