Development Tip

PHP에서 선행 0으로 숫자 서식 지정

yourdevel 2020. 10. 3. 12:03
반응형

PHP에서 선행 0으로 숫자 서식 지정


값을 포함하는 변수가 있습니다 1234567.

정확히 8 자리 숫자를 포함하고 싶습니다 01234567.

이를위한 PHP 기능이 있습니까?


사용 sprintf:

sprintf('%08d', 1234567);

또는 다음을 사용할 수도 있습니다 str_pad.

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

값이 $ value에있는 경우 :

  • 에코하려면 :

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

  • 그것을 얻기 위해:

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

그게 트릭을해야합니다


echo str_pad("1234567", 8, '0', STR_PAD_LEFT);

1 대신 01이 필요할 때 다음이 효과적이었습니다.

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

나는 당신이 무엇을 원하는지 잘 모르겠지만 아마도 sprintf를 찾고있을 것입니다 .

이것은 다음과 같습니다.

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

sprintf 당신이 필요로하는 것입니다.

EDIT ( 어떻게 든 downvotes에 의해 요청 됨 ), 위에 링크 된 페이지에서 다음은 샘플 "제로 패딩 된 정수"입니다.

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

간단한 대답

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

"8 자리를 넘지 않을 것입니다"라는 주석을 해석하는 방법과 입력 또는 출력을 참조하는지 잘 모르겠습니다. 출력을 참조하는 경우 문자열을 자르기 위해 추가 substr () 호출이 있어야합니다.

처음 8 자리를 자르려면

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

마지막 8 자리를 자르려면

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

입력 번호가 항상 7 또는 8 자리 인 경우 다음을 사용할 수도 있습니다.

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

몇 가지 테스트를 실행 한 결과 str_pad또는 sprintf.
입력에 길이가 제한되어 있으면 다음을 사용할 수도 있습니다.

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

이것은 다른 것만 큼 빠르지는 않지만 str_pad보다 조금 더 빠릅니다 sprintf.

BTW : 내 테스트도 그렇게 말한다면 sprintf조금 더 빨리보다 str_pad. 나는 모든 테스트를 PHP 5.6으로 만들었다.


이 형식을 생성하기 위해 다음과 같은 간단한 함수를 작성했습니다. 01:00:03

Seconds are always shown (even if zero). Minutes are shown if greater than zero or if hours or days are required. Hours are shown if greater than zero or if days are required. Days are shown if greater than zero.

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

Examples:

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 

This works perfectly:

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

$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

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

You can always abuse type juggling:

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

This wont work as expected if either 10 ** pad > INT_MAX or value >= 10 * pad.


If you can append zero or anything into string. like

public function saveHoliday($month)
    {
       return "0{$month}";
    }

  echo $this->saveHoliday(1);   // 01

참고URL : https://stackoverflow.com/questions/1699958/formatting-a-number-with-leading-zeros-in-php

반응형