ユーザーが数値を入力できるテキストフィールドがあり、ユーザー入力に基づいて文字列を整数または浮動小数点に変換できるようにしたいと考えています。 Rubyで簡単に行う方法はありますか?例えば文字列を整数型または浮動小数点型に変換する方法
:
User Input: "123" -> Output: 123
User Input: "123.99" -> Output: 123.99
ユーザーが数値を入力できるテキストフィールドがあり、ユーザー入力に基づいて文字列を整数または浮動小数点に変換できるようにしたいと考えています。 Rubyで簡単に行う方法はありますか?例えば文字列を整数型または浮動小数点型に変換する方法
:
User Input: "123" -> Output: 123
User Input: "123.99" -> Output: 123.99
上のあなたは、このようにそれを行うことができます:最初の行は、あなたが常に得ることが保証さ
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になります。
'to_float_or_int( '1a')#=> 1'またはto_float_or_int( '')#=> 0'はどうですか? –
とにかく情報を破棄するので、コンマを確認する必要はありません。 '' 1,23'.to_f => 1' –
すべてのLOCALE設定がフラクショナルインジケータとして '.'を使用するわけではありません。世界中のどこにいるかに応じて、 '1,23'が適切で、' 1,23.to_f'は米国の '1.23'に相当します。 –
使用to_i
またはto_f
文字列
irb(main):001:0> "13".to_i
=> 13
irb(main):002:0> "13".to_f
=> 13.0
私が使用したい:
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から返されます。
あまりにも複雑ではありませんか? '整数(入力)レスキューフロート(入力)レスキューnil'はしないでしょうか? –
'convert(1.23)'は '1'を返します。これは期待しないかもしれません。 –
インライン 'rescue'は' rescue ArgumentError'と同じものをキャッチしません。 –
入力が整数のように見えるときに小数点以下を表示しないようにするには、入力を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)
これは、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
私はこれが役立つことを望みます!
整数を '' 123 "'に、浮動小数点を '' 123.99 "'にしたいですか? – Stefan
あなたはこれをやりたい理由を調べたいかもしれませんか?浮動小数点数が存在する場合、浮動小数点数は実行され、浮動小数点数を返します(例えば、 '1/2'は' 0'を返しますが、 '1.0/2'は' 0.5'を返します。最後に(例えば、ユーザーに '1.0'が表示されないように)、数値を期待どおりにレンダリングするメソッドを調べ、入力を常に浮動小数点数に変換したいと思うかもしれません。 – AJFaraday
ようこそこのように、あなたの努力の証拠を、通常は問題を示す最小限のコードとして見たいのですが、それがなければ、試していないように見えます。 ] "とリンクされたページと" [mcve] "がhttp://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-ユーザーは –