2009-10-09 38 views
182

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

file_001 ...

thay vì

file_1

đơn giản cách nào để thêm số không hàng đầu khi chuyển đổi một số để một chuỗi? (Tôi biết tôi có thể làm "nếu ít hơn 10 .... nếu ít hơn 100").

Trả lời

212

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

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

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

+0

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

+0

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

296

Sử dụng % điều hành với một chuỗi:

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

Các bên trái phía là một chuỗi định dạng printf, và phía bên tay 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 printf format cheat sheet bạn có thể thấy hữu ích khi tạo chuỗi định dạng. Định dạng printf là có nguồn gốc từ các C chức năng printf, nhưng các chức năng tương tự như các định dạng có sẵn trong perl, ruby, python, java, php, vv

+1

Tuyệt vời! Vì vậy, "% s" có nghĩa là "thay thế giá trị thứ N ở đây" và "% 03d" có nghĩa là "thay thế một số ở đây, thêm số 0 nếu cần để biến số đó thành 3 chữ số?" (Tôi đoán d có nghĩa là "chữ số.") Tôi thấy tài liệu về điều này ngay bây giờ (http://www.ruby-doc.org/core/classes/String.html#M000770), nhưng nó rất súc tích và tôi 'd như một chút công phu. –

+1

Tôi đã thêm một liên kết vào một tệp định dạng bản in. "s" có nghĩa là "chuỗi", "d" có nghĩa là "số thập phân". "03", có nghĩa là "pad đến 3 ký tự với số không"; "% 3d" sẽ nằm ở bên trái có dấu cách. –

+0

Tuyệt vời! Cảm ơn lời giải thích hữu ích. –

38

Có thể bạn không chỉ cần sử dụng string formatting giá trị trước khi bạn concat tên tập tin?

"%03d" % number 
+0

Tôi nghĩ 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ó ... – SsouLlesS

+1

Ông trả lời trong cùng một phút như Daniel Martin vì vậy có lẽ không biết về sự trùng lặp. –

+0

Thế giới không công bằng. – Santhosh

20

Sử dụng String#next như quầy.

>> n = "000" 
>> 3.times { puts "file_#{n.next!}" } 
file_001 
file_002 
file_003 
Các vấn đề liên quan