zeri iniziali nelle rotaie


152

Ho dei campi hre min, entrambi i numeri interi nella mia applicazione. Per il hrcampo, se l'utente immette "1", vorrei che Rails lo inserisse automaticamente in "01" prima di salvarlo nel database. Anche per il mincampo se l'utente immette "0" deve essere inserito come "00".

Come posso fare questo?

Risposte:


336

Sarebbe meglio memorizzarlo come numero intero e visualizzarlo come descritto in fase di esecuzione. Ogni lingua ha il suo modo di zeri pad - per Ruby è possibile utilizzare String # rjust . Questo metodo riempie una stringa (giustificata a destra) in modo che diventi una data lunghezza, usando un dato carattere di riempimento.

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

Se integerè maggiore della lunghezza di str, restituisce un nuovo Stringdi lunghezza integercon strgiustificato a destra e riempito con padstr; altrimenti, ritorna 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

Anche questo è abbastanza utile:

"%.2d" % integer

La stringa risultante sarà di 2 caratteri e se il numero è inferiore a 2 caratteri, nella stringa saranno presenti 0 secondi


8

Non è possibile memorizzare 01come numero intero. Sarà convertito in1

Puoi memorizzarlo come una stringa oppure puoi mostrarlo come una stringa "01"


4
Conservarlo come un numero intero e mostrarlo come una stringa (imbottita con 0) sarebbe il mio consiglio. Java StringUtils di Apache aveva un bel metodo pad come quello. Trovato questo thread sull'imbottitura: ruby-forum.com/topic/82137
McStretch

6

Mi piace l'operatore%, anche se sembra essere andato in disgrazia ...

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

Un altro modo per raggiungere questo obiettivo è riempire il tuo numero intero al momento della visualizzazione, usando sprintf:

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

-5

Prova questo e puoi cambiarli per abbinarli

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
Che cosa if num < 0 && num > -1è esattamente ?
Francisco Quintero,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.