จัดรูปแบบตัวเลขด้วยเลขศูนย์นำหน้าใน PHP


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 พูด ตัวเลขติดลบจะไม่มีเลขศูนย์นำหน้าและไม่ใช่จำนวนบวก เช่น 08 จะถูกเขียนเช่นวันที่หรือสิ่งที่คาดว่าจะเป็นตัวเลขสองหลักบวก (รหัสการเรียงลำดับบัญชีธนาคาร ฯลฯ ) โปรดแก้ไขให้ฉันถ้าฉันผิด แต่เท่าที่ฉันรู้ไม่มีอินสแตนซ์ชีวิตจริงของการต้องเป็นศูนย์นำในค่าลบหรือไม่
guyver4mk

3
ต้องการเพิ่มที่sprintf('%+03d:00 UTC',$i)ที่$i-12 ถึง 12 จะพิมพ์ + หรือ - ตามต้องการและจะใส่ศูนย์นำหน้าสำหรับตัวเลขที่น้อยกว่า 2 หลัก เหมาะสำหรับสร้างเขตเวลาSELECTใน HTML
Volomike

2
สำหรับเวอร์ชันปัจจุบัน (7.1) และต่ำกว่าsprintf( 3v4l.org/junvv/perf#output ) จะเร็วกว่าเล็กน้อยstr_pad( 3v4l.org/cliNP/perf#output )
Vladyslav เริ่ม

เมื่อจำนวนลบอาจต้องเป็นศูนย์นำ ... เคาน์เตอร์ยกออกด้วยตัวเลขสามหลัก? T-010, T-009, T-008 เป็นต้น
TRT 1968

83

ระบุว่าค่าเป็น $ value:

  • เพื่อสะท้อน:

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

  • ที่จะได้รับมัน:

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

นั่นควรทำเคล็ดลับ


32

เมื่อฉันต้องการ 01 แทน 1 สิ่งต่อไปนี้ใช้ได้สำหรับฉัน:

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


19

แต่ฉันไม่ได้จริงๆว่าสิ่งที่คุณต้องการที่จะทำคุณอาจจะมองหาsprintf

นี่จะเป็น:

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

16

sprintf คือสิ่งที่คุณต้องการ

แก้ไข ( อย่างใดที่ร้องขอโดย downvotes ) จากหน้าที่ลิงก์ด้านบนนี่คือตัวอย่าง "จำนวนเต็มศูนย์ - เบาะ":

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

3
จะดีกว่าด้วยตัวอย่างหรือคำอธิบายที่มากกว่าแค่การเชื่อมโยง man page สำหรับ 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_padและsprintfเล็กน้อย

Btw: การทดสอบของฉันยังบอกว่าsprintfเร็วกว่าstr_padเล็กน้อย ฉันทำการทดสอบทั้งหมดด้วย PHP 5.6

แก้ไข: Altough substrรุ่นดูเหมือนว่าจะยังคงเป็นอย่างรวดเร็ว (PHP 7.2) ก็ยังเสียในกรณีการป้อนข้อมูลของคุณอาจจะนานกว่าระยะเวลาที่คุณต้องการเพื่อแผ่น เช่นคุณต้องการที่จะ pad ถึง 3 หลักและการป้อนข้อมูลของคุณมี 4 กว่าsubstr('0000' . '1234', -3) = '234'จะส่งผลให้ 3 หลักสุดท้าย


ขอบคุณฉันชอบรูปแบบของคุณ แต่คิดว่าควรจะเป็น $ str = (strlen ($ input) <8)? 0. ใส่ $: ใส่ $;
JMX

@JMX ที่จริงแล้วทั้งสองวิธีทำงานได้ดี (นอกจากการหายไปของ$ฉันฉันเพิ่งแก้ไข)
AbcAeffchen

1

ฉันเขียนฟังก์ชันง่าย ๆ เพื่อสร้างรูปแบบนี้: 01:00:03

วินาทีจะปรากฏขึ้นเสมอ (แม้ว่าจะเป็นศูนย์) นาทีจะปรากฏขึ้นหากต้องการมากกว่าศูนย์หรือถ้าต้องการชั่วโมงหรือวัน ชั่วโมงจะปรากฏขึ้นหากต้องการมากกว่าศูนย์หรือหากต้องการวัน วันจะแสดงหากมากกว่าศูนย์

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 



-1

คุณสามารถใช้การเล่นกลประเภทการละเมิดได้เสมอ:

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

นี้ทำงานตามปกติตามที่คาดว่าอย่างใดอย่างหนึ่งหรือ10 ** pad > INT_MAXvalue >= 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.