2010-04-22 13 views
94

Öyle gibi iki basamaklı sayılara tek basamaklı sayıları dönüştürmek için arıyorum:Ruby on Rails: 10'un altındaysa, bir sayının önüne ekleme sıfırları nasıl eklersiniz?

9 ==> 09 
5 ==> 05 
12 == 12 
4 ==> 04 

ben if-else ifadeleri bir demet koymak (sayı 10 altında ise, o zaman bir gsub yapmak) diye düşündüm ama bu korkunç kodlama. Rails'in number_with_precision olduğunu biliyorum, ancak bunun yalnızca ondalık sayılar için geçerli olduğunu görüyorum. Tek haneli çift haneye dönüştürme hakkında herhangi bir fikir var mı?

cevap

124

Bunu mu demek istediniz: sprintf '%02d', n?

irb(main):003:0> sprintf '%02d', 1 
=> "01" 
irb(main):004:0> sprintf '%02d', 10 
=> "10" 

İleride format table for sprintf başvurmak isteyebilirsiniz, ama bu özel örneğin '%02d' boşluk yerine sıfırlarla en az 2 karakter (2) ve sol dolgu kaplıyor bir tamsayı (d) yazdırmak için anlamı (0).

+0

Teşekkür ederim Mark !! Mükemmel =) Teşekkürler! – sjsc

+0

Bu durumda, '% 02i' değerini kullanmalısınız; çünkü çıktının bir tamsayı olması ve d'nin 'sprintf' kullanmaya alışık olmayan kişiler için daha az sezgisel olması daha açıktır. – SeanJA

6

bu deneyin, bu çalışması gerekir:

abc= 5 
puts "%.2i" %abc >> 05 


abc= 5.0 
puts "%.2f" %abc >> 5.00 
+0

Harika, Tam olarak aradığım şey. Herhangi bir belge var mı, yoksa bu konu hakkında nasıl bilgi edinmeye geldin? – TheMouseMan

167

(yapılacak doğru şey budur) ve bir dize için bu yapmak istiyorsanız bunun en iyisi sprintf kullanan bir sürü insan rjust ve ljust yöntemleri akılda tutulması gerekenler: Bu sağlanarak sağ haklı "4" yapacak

"4".rjust(2, '0') 

bunu en az 2 karakter uzunluğunda bir d '0' ile doldurun. ljust tam tersini yapar.

+2

Dizelere izin vermek istiyorsanız, bu yalnızca sprintf'ten daha iyidir. Aksi halde sprintf kullanırım, çünkü yanlışlıkla bir string kullanırsam bir istisna atar (gerektiği gibi). –