Ruby on Rails: Як додати нулі перед числом, якщо воно менше 10?


110

Я хочу перетворити одноцифрові числа в двоцифрові числа так:

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

Я думаю, я міг би поставити купу тверджень if-else (якщо число менше 10, то зробіть gsub), але цифру це жахливе кодування. Я знаю, що Rails має число_з_докладністю, але я бачу, що це стосується лише десяткових чисел. Будь-які ідеї, як перетворити одноцифрові в двоцифрові?

Відповіді:


142

Ви мали на увазі sprintf '%02d', n?

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

Ви можете посилатися на таблицю форматівsprintf у майбутньому, але для цього конкретного прикладу '%02d'означає надрукувати ціле число ( d), що містить щонайменше 2 символи ( 2), а ліву підкладку з нулями замість пробілів ( 0).


Дякую Марку !! Ідеально =) Дякую!
sjsc

Вам, мабуть, слід скористатися %02iдля цього випадку, оскільки очевидно, що результат є і повинен бути цілим числом, d менш інтуїтивно зрозумілий для людей, які не так звикли використовувати sprintf.
SeanJA

можна просто '%02d'%1без спринту
Qiushi Huang,

194

Дуже багато людей, які використовують sprintf(що правильно робити), і я думаю, що якщо ви хочете зробити це для рядка, то краще пам’ятати про методи rjustта ljustметоди:

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

Це зробить "4"право виправданим, забезпечивши, щонайменше, 2символів довгими та проклавши його '0'. ljustробить навпаки.


2
Це краще, ніж sprintf, якщо ви хочете дозволити рядки. Інакше я б використовував sprintf, оскільки він кидає виняток (як слід), якщо я випадково використовую рядок.
Велізар Христов

Якщо ви знаєте, що ви починаєте з рядкового представлення числа, мені це подобається краще, ніж спринтф для продуктивності. Використання rjustдозволяє уникнути витрат на аналіз рядка формату sprintf, перетворення рядка в число та перетворення цього числа назад у рядок. Крім того, людині (напевно) легко зрозуміти, що код намагається зробити з першого погляду.
Девід Хемпі


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.