Ruby'de önde gelen sıfırları nasıl çıkarabilirim?


238

Ruby komut dosyasındaki bir dizi numara çıktısını veriyorum. Sayılar bir sayacı artırmaktan gelir, ancak onları dizinde güzel sıralamak için, dosya adlarında önde gelen sıfırları kullanmak istiyorum. Diğer bir deyişle

file_001 ...

onun yerine

file_1

Bir sayıyı bir dizeye dönüştürürken baştaki sıfırları eklemenin basit bir yolu var mı ? ("10'dan az ise ... 100'den azsa" yapabileceğimi biliyorum).

Yanıtlar:


281

Sayaçtaki maksimum basamak sayısı biliniyorsa (örn. Sayaçlar 1..876 için n = 3),

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

8
Heh heh, en iyi cevap değil, ama rjust hakkında bilmiyordum ve yıllardır yakut kullanıyorum. Şerefe!
pauliephonic

Bunu oylamalısın çünkü% 03s bazı tuhaf nedenlerden dolayı boşluklu pedler (% 03d iyi çalışıyor gibi görünüyor). Her iki durumda da sıfırlarla doldurulmuş C yemin edebilirdim.
Nerdmaster

Sonunda bunu kabul edilen cevap olarak değiştirdi çünkü hatırlanması en kolay ve kolay. %çalışır ama daha genel bir amaçtır.
Nathan Long

beklenmedik ama en kolay
akostadinov

1
Nasıl bir baz numarası 36 pad için buraya geldi. Bu işe yarıyor, oysa% bunu yapmayacak gibi görünüyor. Teşekkürler!
Ethan Kaminski

344

%İşleci bir dize ile kullanın :

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

Sol taraf bir printf formatı dizesidir ve sağ taraf bir değerler listesi olabilir, böylece şöyle bir şey yapabilirsiniz:

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

Biçim dizenizi oluştururken yararlı bulabileceğiniz bir printf biçimi hile sayfası . Printf formatı aslında Cfonksiyondan printf, ancak perl, yakut, python, java, php vb.


1
Harika! Yani "% s", "burada N'inci değer yerine geçecek" anlamına gelir ve "% 03d", "burada bir sayı yerine geçecek ve 3 basamaklı bir sayı yapmak için gerektiği kadar sıfır ekleyecek?" Anlamına gelir. ( D' nin "basamak" anlamına geldiğini tahmin ediyorum.) Bu konudaki dokümanları şimdi görüyorum ( ruby-doc.org/core/classes/String.html#M000770 ), ama çok özlü ve biraz ayrıntı istiyorum .
Nathan Long

1
Ben printf formatında bir kopya sayfasına bir link ekledim. "s", "dize" anlamına gelir; "d", "ondalık sayı" anlamına gelir. "03", "sıfırlı 3 karaktere kadar yastık" anlamına gelir; "% 3d" solda boşluklarla doluyor.
Daniel Martin

2
BTW - bu, Kernel#sprintfburada belgelenen arama ile aynıdır : ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf
Nathan Long

@ NathanLong'un yorumuna ek olarak, bu cevaptaki ilk örnek olarak yazılır sprintf("%03d", 5).
Dennis

Bu seçilen cevap olmalıdır.
Dan Barron

50

Dosya adına bitişik olmadan önce değerin dize biçimlendirmesini kullanamaz mısınız?

"%03d" % number

Bence bu cevap @Daniel Martin'in cevabına hiçbir şey katmıyor, ancak basitliğini beğendim ...
svelandiag

3
Daniel Martin'le aynı dakika içinde cevap verdi, bu yüzden muhtemelen tekrardan habersizdi.
Kurt Peek

Bu utc_offset için mükemmeldir
Abel

30

String#nextSayaç olarak kullanın .

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

next göreceli olarak 'akıllı', yani

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

Bunu işaret ettiğiniz için teşekkürler. Bu harika bir yöntem.
Weston Ganger

9

Diğer cevapların belirttiği gibi, "%03d" % numberoldukça iyi çalışıyor, ancak rubocop yakut stil kılavuzuna karşı çıkıyor :

Sprintf ve diğer ad biçiminin oldukça şifreli String #% yöntemi üzerinde kullanılmasını sağlayın

Aynı sonucu aşağıdakileri kullanarak daha okunabilir bir şekilde elde edebiliriz:

format('%03d', number)

1
Amacınız belirsiz bir Ruby dili özelliği öğrenmekse, diğer adı kullanın format. Amacınız kodunuzun anlaşılmasını kolaylaştırmaksa kullanmalısınız sprintf, çünkü bu standart C kütüphanesinin bir parçasıdır. Bu ad programlama dillerinde kullanılır. Bunun bir takma ad sprintfolduğunu bilen numaraya kıyasla daha fazla insanın ne anlama geldiğini anlaması format. Bir şeyin RuboCop'un bir parçası olması, doğası gereği doğru veya yanlış yapmaz. Projeniz için en anlamlı kuralları seçin. '%03d' % numberdaha da kolay okunur.
Tilo

1
Ben değiştirerek, bu aynı döngü geçti "%02d" % numiçin sprintf(...)daha sonra, format(...)RuboCop önerisi başına. Daha sonra sprintf, daha formatgüncel rubocop.yml ile daha geleneksel olduğuna karar verdim Style/FormatString: EnforcedStyle: sprintfve şimdi geceleri iyi uyuyorum.
David Hempy

1

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

çıktılar

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.