 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Parsing A Number From A String | ||
|---|---|---|
| Code | Expected | Actual | 
| '400'.to_i | 400 | 400 | 
| '3.14'.to_f | 3.14 | 3.14 | 
| '1.602e-19'.to_f | 1.602e-19 | 1.602e-19 | 
| '405'.oct | 261 | 261 | 
| '405'.to_i(8) | 261 | 261 | 
| '405'.hex | 1029 | 1029 | 
| '405'.to_i(16) | 1029 | 1029 | 
| 'fed'.hex | 4077 | 4077 | 
| 'fed'.to_i(16) | 4077 | 4077 | 
| "13: a baker's dozen".to_i | 13 | 13 | 
| '1001 Nights'.to_i | 1001 | 1001 | 
| 'The 1000 Nights and a Night'.to_i | 0 | 0 | 
| '60.50 Misc. Agricultural Equipment'.to_f | 60.5 | 60.5 | 
| '$60.50'.to_f | 0.0 | 0.0 | 
| 'Feed the monster!'.hex | 65261 | 65261 | 
| 'I fed the monster at Canoga Park Waterslides'.hex | 0 | 0 | 
| '0xA2Z'.hex | 162 | 162 | 
| '-10'.oct | -8 | -8 | 
| '-109'.oct | -8 | -8 | 
| '3.14'.to_i | 3 | 3 | 
| Integer('1001') | 1001 | 1001 | 
| Integer('1001 nights') | ArgumentError: invalid value for Integer: "1001 nights" ... | ArgumentError: invalid value for Integer: "1001 nights" from (irb):22:in `Integer' from (irb):22 | 
| Float('99.44') | 99.44 | 99.44 | 
| Float('99.44% pure') | ArgumentError: invalid value for Float(): "99.44% pure" ... | ArgumentError: invalid value for Float(): "99.44% pure" from (irb):24:in `Float' from (irb):24 | 
| class NumberParser
  @@number_regexps = { 
    :to_i => /([+-]?[0-9]+)/,
    :to_f => /([+-]?([0-9]*\.)?[0-9]+(e[+-]?[0-9]+)?)/i,
    :oct => /([+-]?[0-7]+)/,
    :hex => /\b([+-]?(0x)?[0-9a-f]+)\b/i
    #The \b characters prevent every letter A-F in a word from being
    #considered a hexadecimal number.
  }
  def NumberParser.re(parsing_method=:to_i)
    re = @@number_regexps[parsing_method] 
    raise ArgumentError, "No regexp for #{parsing_method.inspect}!" unless re
    return re
  end
  def extract(s, parsing_method=:to_i)
    numbers = []
    s.scan(NumberParser.re(parsing_method)) do |match| 
      numbers << match[0].send(parsing_method) 
    end
    numbers
  end
end
p = NumberParser.new
pw = "Today's numbers are 104 and 391."
NumberParser.re(:to_i).match(pw).captures | ["104"] | ["104"] | 
| p.extract(pw, :to_i) | [104, 391] | [104, 391] | 
| p.extract('The 1000 nights and a night') | [1000] | [1000] | 
| p.extract('$60.50', :to_f) | [60.5] | [60.5] | 
| p.extract('I fed the monster at Canoga Park Waterslides', :hex) | [4077] | [4077] | 
| p.extract('In octal, fifteen is 017.', :oct) | [15] | [15] | 
| p.extract('From 0 to 10e60 in -2.4 seconds', :to_f) | [0.0, 1.0e+61, -2.4] | [0.0, 1.0e+61, -2.4] | 
| p.extract('From 0 to 10e60 in -2.4 seconds') | [0, 10, 60, -2, 4] | [0, 10, 60, -2, 4] | 
| require 'scanf'
s = '0x10 4.44 10'.scanf('%x %f %d') | [16, 4.44, 10] | [16, 4.44, 10] |