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


600

값이 포함 된 변수가 있습니다 1234567.

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

이를위한 PHP 함수가 있습니까?

답변:


1212

사용 sprintf:

sprintf('%08d', 1234567);

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

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

54
str_pad는 음수가있는 옵션이 아닙니다.
wtf8_decode

6
wtf8_decode가 말한 것 위에 추가하기 만하면됩니다. 음수는 앞에 0이없고 양수가 아닙니다. 예를 들어 08은 날짜 또는 양수의 두 자리 숫자 (은행 계좌 정렬 코드 등)를 예상하는 것과 같이 작성됩니다. 내가 틀렸다면 나를 수정하십시오. 그러나 내가 아는 한 음수 값에 선행 0을 요구하는 실례는 없습니다.
guyver4mk

3
-12에서 12 사이의 sprintf('%+03d:00 UTC',$i)위치 를 추가하고 $i필요에 따라 + 또는-를 인쇄하고 2 자리 미만의 숫자에 선행 0을 넣습니다. SELECTHTML 로 시간대를 만들기에 좋습니다.
Volomike

2
현재 버전 (7.1) 이하 sprintf( 3v4l.org/junvv/perf#output )는 str_pad( 3v4l.org/cliNP/perf#output ) 보다 약간 빠릅니다.
Vladyslav Startsev

음수에 선행 0이 필요할 수있는 경우 ... 세 자리 숫자의 리프트 오프 카운터? T-010, T-009, T-008 등
TRT 1968

83

값이 $ value 인 경우 :

  • 그것을 반향 시키려면 :

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

  • 그것을 얻기 위해:

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

그 트릭을해야합니다


32

1 대신 01이 필요할 때 다음이 나를 위해 일했습니다.

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


19

나는 당신이 무엇을하고 싶은지 잘 모르겠지만 아마도 sprintf 찾고 있습니다.

이것은 :

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

16

sprintf 당신이 필요한 것입니다.

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

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

3
sprintf ()에 대한 매뉴얼 페이지를 링크하는 것 이상의 예제 나 설명이 있으면 더 좋습니다.
jharrell

13

간단한 답변

$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

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

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

몇 가지 테스트를 실행하여 str_pad또는 최대 두 배 빠릅니다 sprintf.
입력에 길이가 있으면 다음을 사용할 수도 있습니다.

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

이것은 다른 것만 큼 빠르지는 않지만 str_padand 보다 약간 빠릅니다 sprintf.

BTW : 내 테스트도 그렇게 말한다면 sprintf조금 더 빨리보다 str_pad. PHP 5.6으로 모든 테스트를 수행했습니다.

편집 : 입력해도 substr버전은 여전히 매우 빠른 (PHP 7.2)가, 그것은 또한 경우에 깨진 것 같다 귀하의 의견은 더 이상 당신을 패드에 원하는 길이보다 될 수 있습니다. 예를 들어, 3 자리 숫자로 채우고 입력 한 값은 4 자리이며 substr('0000' . '1234', -3) = '234'마지막 3 자리 만 나타납니다.


고맙습니다, 나는 당신의 변형을 좋아하지만 $ str = (strlen ($ input) <8)이어야한다고 생각합니다. 0 $ 입력 : $ 입력;
JMX

@JMX 사실 두 가지 방법 모두 잘 작동합니다. (내 실종 옆에 $방금 수정)
AbcAeffchen

1

이 간단한 함수를 작성하여 다음 형식을 생성했습니다. 01:00:03

초는 항상 표시됩니다 (0 인 경우에도). 0보다 크거나 시간 또는 일이 필요한 경우 분이 표시됩니다. 시간은 0보다 크거나 일이 필요한 경우에 표시됩니다. 일이 0보다 큰 경우 표시됩니다.

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

예 :

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

이것은 완벽하게 작동합니다.

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

3
이것은 기존 답변의 반복 인 것 같습니다.
Pang

-1

항상 유형 저글링을 남용 할 수 있습니다.

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

10 ** pad > INT_MAX또는 이면 예상대로 작동하지 않습니다 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.