2014-01-20 47 views
1

我們這些字符串:如何確定字符串中的數字類型?

  • 「1/2」
  • 「1」
  • 「0.9」
  • 「B」
  • 「0,9」

我如何確定字符串是什麼類型的數據?

  • 有理數
  • 整數
  • 浮子
  • 不是數字
  • 不是數字
一體的代碼

+2

在你的情況,我認爲你應該通過實施你自己的方法來更好地解析字符串。如果你有興趣,我可以給你一個答案。 – Agis

回答

1

使用內置驗證器中的內核來做到這一點的另一種方式,就像一個想法一樣。

但是,我認爲應該避免構建其異常功能的代碼,其他解決方案可能是首選。

def determine_type x 
[:Integer, :Float, :Rational].each do |c| 
    return c if send(c, x) rescue ArgumentError 
end 
return :String 
end 

p determine_type(1)  #=> :Integer 
p determine_type('1') #=> :Integer 
p determine_type('1.0') #=> :Float 
p determine_type('1/1') #=> :Rational 
p determine_type('ccc') #=> :String 
6
{Rational => :to_r, Integer => :to_i, Float => :to_f }.each do |key, sym| 
    ["1/2", "1", "0.9"].each do |item| 
    puts "#{item} is #{key}" if item.send(sym).to_s == item 
    end 
end 

#1/2 is a Rational 
#1 is a Integer 
#0.9 is a Float 

爲「不是一個數字」的情況下,我認爲這很容易使用regular expressions來增強位

2

更靈活,更安全的方法:

def parse(data) 
    h = { 
    "Float" => /\A\d+\.\d+\Z/, 
    "Integer" => /\A\d+\Z/, 
    "Rational" => /\A\d+\/\d+\Z/ 
    } 

    h.each do |type, regex| 
    return type if data.match regex 
    end 

    return "Not a number" 
end 

parse("1") # => "Integer" 
parse("1.2") # => "Float" 
parse("1/2") # => "Rational" 
parse("1,2") # => "Not a number" 
parse("b") # => "Not a number" 

你可以很容易地修改的鍵h哈希到如果你想它返回實際的類而不是字符串。

+1

良好的正則表達式解決方案,但如果使用Ruby的case語句,它可能會更容易閱讀。 – hirolau

相關問題