wiodące zera w szynach


152

W mojej aplikacji mam pola hri minobie liczby całkowite. W przypadku hrpola, jeśli użytkownik wpisze „1”, chciałbym, aby Railsy automatycznie dopełniły go do „01” przed zapisaniem w bazie danych. Również w przypadku minpola, jeśli użytkownik wprowadzi „0”, należy wpisać „00”.

W jaki sposób mogę to zrobić?

Odpowiedzi:


336

Lepiej byłoby zapisać go jako liczbę całkowitą i po prostu wyświetlić go tak, jak opisano w czasie wykonywania. Każdy język ma swój własny sposób wypełniania zer - w przypadku Rubiego możesz użyć String # rjust . Ta metoda dopełnia ciąg (wyrównany do prawej), tak aby uzyskał określoną długość, używając danego znaku dopełniającego.

str.rjust(integer, padstr=' ') → new_str

Jeśli integerjest większa niż długość str, zwraca nową Stringdługość integerz strwyrównaniem do prawej i dopełnieniem padstr; w przeciwnym razie zwraca str.

some_int = 5
some_int.to_s.rjust(2, '0')  # => '05'
some_int.to_s.rjust(5, '0')  # => '00005'

another_int = 150
another_int.to_s.rjust(2, '0') # => '150'
another_int.to_s.rjust(3, '0') # => '150'
another_int.to_s.rjust(5, '0') # => '00150'


20

Jest to również bardzo przydatne:

"%.2d" % integer

Otrzymany ciąg będzie składał się z 2 znaków, a jeśli liczba będzie mniejsza niż 2 znaki, w ciągu będą obecne 0


8

Nie możesz przechowywać 01jako liczby całkowitej. Zostanie przekonwertowany na1

Możesz zapisać go jako ciąg lub wyświetlić jako ciąg „01”


4
Przechowuj go jako liczbę całkowitą i pokazuj jako ciąg (uzupełniony 0) to moja rekomendacja. Apache Java StringUtils miała fajną metodę padów, taką jak ta. Znaleziono ten wątek na wyściółce: ruby-forum.com/topic/82137
McStretch

6

Podoba mi się operator%, chociaż wydaje się, że wyszedł z łask ...

2.0.0-p247 :001 > '%02i' % 1
 => "01"
2.0.0-p247 :002 > '%2i' % 1
 => " 1"
2.0.0-p247 :003 > '%-2i' % 1
 => "1 "

3

Innym sposobem osiągnięcia tego jest dopełnienie liczby całkowitej w czasie wyświetlania za pomocą sprintf:

f = sprintf '%04d', 49
# f = "0049"

-5

Spróbuj tego, a możesz je zmienić, aby pasowały

def numeric92(num)
  if num.present?
    if num < 0 && num > -1
      ('-%05d' % num) + '.' + ('%.2f' % num).split('.').last
    else
      ('%06d' % num) + '.' + ('%.2f' % num).split('.').last
    end
  else
    '000000.00'
  end
end

1
Co if num < 0 && num > -1to właściwie jest?
Francisco Quintero
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.