2016-11-21 10 views
3

ユーザーが数値を入力できるテキストフィールドがあり、ユーザー入力に基づいて文字列を整数または浮動小数点に変換できるようにしたいと考えています。 Rubyで簡単に行う方法はありますか?例えば文字列を整数型または浮動小数点型に変換する方法

User Input: "123" -> Output: 123 
User Input: "123.99" -> Output: 123.99 
+0

整数を '' 123 "'に、浮動小数点を '' 123.99 "'にしたいですか? – Stefan

+1

あなたはこれをやりたい理由を調べたいかもしれませんか?浮動小数点数が存在する場合、浮動小数点数は実行され、浮動小数点数を返します(例えば、 '1/2'は' 0'を返しますが、 '1.0/2'は' 0.5'を返します。最後に(例えば、ユーザーに '1.0'が表示されないように)、数値を期待どおりにレンダリングするメソッドを調べ、入力を常に浮動小数点数に変換したいと思うかもしれません。 – AJFaraday

+0

ようこそこのように、あなたの努力の証拠を、通常は問題を示す最小限のコードとして見たいのですが、それがなければ、試していないように見えます。 ] "とリンクされたページと" [mcve] "がhttp://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-ユーザーは –

答えて

-4

上のあなたは、このようにそれを行うことができます:最初の行は、あなたが常に得ることが保証さ

def to_float_or_int(string) 
    throw "error" unless string && string.length > 0 
    return string.to_f if string.include?('.') || string.include?(',') 
    string.to_i 
end 

入力に基づく結果これを削除すると、空の文字列はエラーではなく0になります。

+0

'to_float_or_int( '1a')#=> 1'またはto_float_or_int( '')#=> 0'はどうですか? –

+0

とにかく情報を破棄するので、コンマを確認する必要はありません。 '' 1,23'.to_f => 1' –

+0

すべてのLOCALE設定がフラクショナルインジケータとして '.'を使用するわけではありません。世界中のどこにいるかに応じて、 '1,23'が適切で、' 1,23.to_f'は米国の '1.23'に相当します。 –

3

使用to_iまたはto_f文字列

irb(main):001:0> "13".to_i 
=> 13 
irb(main):002:0> "13".to_f 
=> 13.0 
-1

私が使用したい:

def convert(input) 
    [:Integer, :Float].each do |m| 
    begin 
     return Kernel.method(m).call(input) 
    rescue ArgumentError 
    end 
    end 
    nil 
end 

convert('') # => nil 
convert(' ') # => nil 
convert('1') # => 1 
convert('1.0') # => 1.0 
convert('.01') # => 0.01 

それが動作しない方法は?

Integer()Float()よう

Kernel.method(m) 

callがそれにinput値を送信することができ、メソッドオブジェクトを返す、カーネルクラスのメソッドです。成功すると、戻り値が返され、eachループが終了します。 rescue ArgumentErrorが爆発したら、それを捕まえて、eachループが続きます。ループが短絡されずに、returnで終わると、nilがRubyから返されます。

+0

あまりにも複雑ではありませんか? '整数(入力)レスキューフロート(入力)レスキューnil'はしないでしょうか? –

+0

'convert(1.23)'は '1'を返します。これは期待しないかもしれません。 –

+0

インライン 'rescue'は' rescue ArgumentError'と同じものをキャッチしません。 –

0

入力が整数のように見えるときに小数点以下を表示しないようにするには、入力をFloatに変換して'%g'を使用して数値を表示します。

数値が浮動小数点数または整数であるかどうかを確認するために予期しない動作が発生するか、またはロジックを記述する必要があります。

def display_number(input) 
    '%g' % Float(input) 
end 

puts display_number("1") 
puts display_number(2) 
puts display_number("1.23") 
puts display_number(2.3456) 
puts display_number(Math::PI) 
puts display_number("not a number") 

# => 1 
# 2 
# 1.23 
# 2.3456 
# 3.14159 
# convert_to_int_or_float.rb:2:in `Float': invalid value for Float(): "not a number" (ArgumentError) 
0

これは、2つの新しいメソッドで文字列を拡張しますが、あなただけの任意の文字列に#to_numericを呼び出す必要があり、それがフロートまたはそれに応じてint型のいずれかを返します。

class String 
    def numeric_string? 
    Float(self) != nil rescue false 
    end 

    def to_numeric 
    if self.numeric_string? 
     if self.index('.') 
     return self.to_f 
     else 
     return self.to_i 
     end 
    end 
    end 
end 

['2.0', '15', '4500.1234', '111.234'].each do |str| 
    puts str.to_numeric 
end 

# 2.0 
# 15 
# 4500.1234 
# 111.234 

私はこれが役立つことを望みます!

関連する問題