Làm cách nào tôi có thể xuất các số 0 đứng đầu trong Ruby?


238

Tôi đang xuất một tập hợp các tệp được đánh số từ tập lệnh Ruby. Các con số đến từ việc tăng một bộ đếm, nhưng để làm cho chúng sắp xếp độc đáo trong thư mục, tôi muốn sử dụng các số 0 đứng đầu trong tên tệp. Nói cách khác

tập tin_001 ...

thay vì

tập tin_1

Có một cách đơn giản để thêm các số 0 đứng đầu khi chuyển đổi một số thành một chuỗi? (Tôi biết tôi có thể làm "nếu dưới 10 .... nếu dưới 100").

Câu trả lời:


281

Nếu số lượng chữ số tối đa trong bộ đếm được biết đến (ví dụ: n = 3 cho các bộ đếm 1..876), bạn có thể làm

str = "file_" + i.to_s.rjust(n, "0")

8
Heh heh, không phải là câu trả lời hay nhất, nhưng tôi không biết về sự bất công và tôi đã sử dụng ruby ​​trong nhiều năm. Chúc mừng!
pauliephonic

Phải bỏ phiếu này vì có vẻ như các miếng đệm% 03s có khoảng trắng vì một số lý do kỳ lạ (% 03d dường như hoạt động tốt). Tôi có thể đã tuyên thệ C đệm với số không trong cả hai trường hợp.
Nerdmaster

Cuối cùng chuyển câu trả lời này thành câu trả lời được chấp nhận vì nó đơn giản và dễ nhớ nhất. %hoạt động nhưng là mục đích chung hơn.
Nathan Long

bất ngờ nhưng dễ nhất
akostadinov

1
Đến đây để biết cách đệm số 36 cơ sở. Điều này hoạt động cho điều đó, trong khi% có vẻ như nó sẽ không. Cảm ơn!
Ethan Kaminski

344

Sử dụng %toán tử với một chuỗi:

irb(main):001:0> "%03d" % 5
=> "005"

Phía bên trái là một chuỗi định dạng printf và phía bên phải có thể là một danh sách các giá trị, vì vậy bạn có thể làm một cái gì đó như:

irb(main):002:0> filename = "%s/%s.%04d.txt" % ["dirname", "filename", 23]
=> "dirname/filename.0023.txt"

Đây là một bảng cheat định dạng printf mà bạn có thể thấy hữu ích trong việc hình thành chuỗi định dạng của mình. Định dạng printf ban đầu là từ Chàm printf, nhưng các hàm định dạng tương tự có sẵn trong perl, ruby, python, java, php, v.v.


1
Tuyệt quá! Vì vậy, "% s" có nghĩa là "thay thế giá trị N ở đây" và "% 03d" có nghĩa là "thay thế một số ở đây, thêm bao nhiêu số không cần thiết để biến nó thành số có 3 chữ số?" (Tôi đoán chữ d có nghĩa là "chữ số.") Tôi thấy tài liệu về điều này ngay bây giờ ( ruby-doc.org/core/groupes/String.html#M000770 ), nhưng nó rất súc tích và tôi muốn một chút chi tiết .
Nathan Long

1
Tôi đã thêm một liên kết đến một bảng cheat định dạng printf. "S" có nghĩa là "chuỗi", "d" có nghĩa là "số thập phân". "03", có nghĩa là "đệm đến 3 ký tự có số không"; "% 3d" sẽ đệm bên trái với khoảng trắng.
Daniel Martin

2
BTW - điều này giống như cách gọi Kernel#sprintf, được ghi lại ở đây: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf
Nathan Long

Thêm vào bình luận của @ NathanLong, ví dụ đầu tiên trong câu trả lời này sẽ được viết dưới dạng sprintf("%03d", 5).
Dennis

Đây phải là câu trả lời được lựa chọn.
Dan Barron

50

Bạn không thể sử dụng định dạng chuỗi của giá trị trước khi ghép tên tệp?

"%03d" % number

Tôi nghĩ rằng câu trả lời này không thêm bất cứ điều gì vào câu trả lời của @Daniel Martin, tuy nhiên tôi thích sự đơn giản của nó ...
secraftiag

3
Anh ta trả lời trong cùng một phút với Daniel Martin nên có lẽ không biết gì về sự trùng lặp.
Kurt Peek

Điều này là hoàn hảo cho utc_offset
Abel

30

Dùng String#nextlàm quầy.

>> n = "000"
>> 3.times { puts "file_#{n.next!}" }
file_001
file_002
file_003

next là tương đối 'thông minh', có nghĩa là bạn thậm chí có thể đi

>> n = "file_000"
>> 3.times { puts n.next! }
file_001
file_002
file_003

Cảm ơn đã chỉ ra điều này. Đây là một phương pháp tuyệt vời.
Weston Ganger

9

Như đã nêu trong các câu trả lời khác, "%03d" % numberhoạt động khá tốt, nhưng nó đi ngược lại hướng dẫn về phong cách rubyop rubyop :

Ưu tiên sử dụng sprintf và định dạng bí danh của nó so với phương thức String #% khá khó hiểu

Chúng ta có thể có được kết quả tương tự theo cách dễ đọc hơn bằng cách sử dụng như sau:

format('%03d', number)

1
Nếu mục tiêu của bạn là tìm hiểu một tính năng ngôn ngữ Ruby tối nghĩa, thì hãy sử dụng bí danh format. Nếu mục tiêu của bạn là làm cho mã của bạn dễ hiểu, bạn nên sử dụng sprintf, vì đó là một phần của thư viện C tiêu chuẩn. Tên này được sử dụng trên các ngôn ngữ lập trình. Cách nhiều người hiểu những gì sprintflàm, so với số người biết đó formatlà bí danh cho nó. Chỉ vì một cái gì đó là một phần của RuboCop không làm cho nó đúng hay sai. Chọn các quy tắc có ý nghĩa nhất cho dự án của bạn. '%03d' % numberthậm chí còn dễ đọc hơn
Tilo

1
Tôi đã trải qua vòng lặp tương tự, thay đổi "%02d" % numthành sprintf(...), sau đó format(...)theo đề xuất của RuboCop. Sau đó tôi đã quyết định rằng nó sprintfthông thường hơn format, vì vậy đã cập nhật rubocop.yml Style/FormatString: EnforcedStyle: sprintfvà bây giờ tôi ngủ ngon vào ban đêm.
David Hempy

1

filenames = '000'.upto('100').map { |index| "file_#{index}" }

Đầu ra

[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]

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.