a

Câu hỏi Định dạng một số có số 0 đứng đầu trong PHP


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ố, tức là 01234567.

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


469
2017-11-09 09:25


gốc


nó sẽ không bao giờ nhiều hơn 8 chữ số ... - Andromeda
Đó là định dạng số và không làm tròn. - Gumbo
có vẻ như bạn muốn đệm thay vì làm tròn - Peter Lindqvist


Các câu trả lời:


Sử dụng sprintf :

sprintf('%08d', 1234567);

Hoặc bạn cũng có thể sử dụng str_pad:

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

946
2017-11-09 09:29



Chỉ muốn thêm: str_pad không phải là tùy chọn có số âm - wtf8_decode
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ư ngày tháng, hoặc một cái gì đó dự kiến ​​một con số có hai con số dương (Mã phân loại tài khoản ngân hàng, v.v ...). Vui lòng sửa tôi nếu tôi sai, nhưng theo như tôi biết, không có ví dụ thực tế nào về việc yêu cầu số 0 đứng đầu về giá trị âm? - guyver4mk
Muốn thêm rằng sprintf('%+03d:00 UTC',$i) Ở đâu $i là -12 đến 12, sẽ in + hoặc - khi cần, và cũng sẽ đặt số 0 đứng đầu cho các số nhỏ hơn 2 chữ số. Tuyệt vời để tạo múi giờ SELECT trong HTML. - Volomike
cho 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
09 và 08 không hoạt động trong PHP7 - Hiren Bhut


Cho rằng giá trị bằng giá trị $:

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

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

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

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

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


70
2017-11-09 09:28





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

18
2017-10-16 08:33





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ể đang tìm kiếm sprintf.

Điều này sẽ:

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

17
2017-11-09 09:33





Khi tôi cần 01 thay vì 1, những điều sau đây làm việc cho tôi:

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

16
2018-04-23 08:55





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

CHỈNH SỬA (bằng cách nào đó yêu cầu của downvotes), từ trang được liên kết ở trên, đây là mẫu "số nguyên không đệm":

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

14
2017-11-09 09:27



Sẽ tốt hơn với một ví dụ hoặc giải thích thêm ngoài việc chỉ cần liên kết trang người dùng cho sprintf (). - jharrell
@jharrell cảm thấy tự do để chỉnh sửa :)


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

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

Tôi không chắc chắn làm thế nào để giải thích các bình luận nói rằng "Nó sẽ không bao giờ được nhiều hơn 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ó thêm một dấu () gọi để 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 cùng

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

13
2017-11-09 09:30





Nếu 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 điều này sẽ tăng gấp đôi nhanh như str_pad hoặc là 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);

Đây không phải là nhanh như một trong những khác, nhưng cũng nên được một chút nhanh hơn str_pad và sprintf.

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


5
2018-06-06 22:48



Cảm ơn, tôi thích biến thể của bạn nhưng nghĩ rằng nó nên là $ str = (strlen ($ input) <8)? 0. $ đầu vào: $ đầu vào; - JMX
@ JMX Trong thực tế, cả hai cách làm việc tốt. (Bên cạnh thiếu của tôi $ Tôi vừa sửa) - AbcAeffchen