Come posso analizzare un numero da una Stringa che può avere uno zero?
Domanda
In ruby sono l'analisi di un data nel seguente formato:24092008.Voglio convertire ogni sezione (anno, mese, giorno) in un numero.
Ho diviso con una regex che produce tre Corde che sto passando in un valore Integer costruttore.
date =~ /^([\d]{2})([\d]{2})([\d]{4})/
year = Integer($3)
month = Integer($2)
day = Integer($1)
Quando si colpisce il mese linea si blocca come segue:
`Integer': invalid value for Integer: "09" (ArgumentError)
Mi ci è voluto un po ' per rendersi conto che si tratta di interpretare il leader zero come Ottale e 09 non è un valido numero Ottale (funziona bene con "07").
C'è una soluzione elegante per questo o devo solo test per i numeri inferiori a 10 e rimuovere lo zero prima?
Grazie.
Soluzione
Non ho familiarità con le espressioni regolari, quindi perdonami se questa risposta è off-base.Sto supponendo che $3, $2, $1 sono stringhe.Ecco quello che ho fatto in IRB per replicare il problema:
irb(main):003:0> Integer("04")
=> 4
irb(main):004:0> Integer("09")
ArgumentError: invalid value for Integer: "09"
from (irb):4:in `Integer'
from (irb):4
from :0
Ma sembra che .to_i non avere gli stessi problemi:
irb(main):005:0> "04".to_i
=> 4
irb(main):006:0> "09".to_i
=> 9
Altri suggerimenti
Specificare in base 10
Dire Rubino esplicitamente che si desidera interpretare la stringa come base 10 numero.
Integer("09", 10) # => 9
Questo è meglio .to_i
se si vuole essere rigorosi.
"123abc".to_i # => 123
Integer("123abc", 10) # => ArgumentError
Come ho capito questo
In irb
, method(:Integer)
restituisce #<Method: Object(Kernel)#Integer>
.Che mi ha detto che Kernel
possiede questo metodo, e ho guardato la documentazione del Kernel. La firma del metodo dimostra che ci vuole una base come secondo argomento.
Forse (0([\d])|([1-9][\d]))
in luogo di ([\d]{2})
Si potrebbe usare $2, $4, $e 5 $ al posto di $1, $2, $3.
O se la tua regexp supporta (?:...)
quindi utilizzare (?:0([\d])|([1-9][\d]))
Dal momento che ruby prende le sue espressioni regolari in perl, quest'ultima versione dovrebbe funzionare.