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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top