我有一个文本字段,用户可以输入一个数字,我希望能够根据用户输入将字符串转换为整数或浮点数。在Ruby中有一种简单的方法吗?
例如:
User Input: "123" -> Output: 123
User Input: "123.99" -> Output: 123.99
答案 0 :(得分:4)
在字符串
上使用to_i
或to_f
irb(main):001:0> "13".to_i
=> 13
irb(main):002:0> "13".to_f
=> 13.0
答案 1 :(得分:1)
这是一个常见的练习。可能会有更优雅的方法来执行此操作,但这是我附带的最简单的一种。
[0]
请记住,mod运算符并不完全精确。但是在这种情况下,它应该适用于任何字符串。
答案 2 :(得分:0)
如果您只想在输入看起来像Integer时避免显示小数,可以将输入转换为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)
答案 3 :(得分:0)
这将使用两个新方法扩展String,但您只需要在任何字符串上调用#to_numeric
,它将相应地返回float或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
我希望这有帮助!
答案 4 :(得分:0)
您可以将to_f
函数与round
一起使用,以将字符串更改为带有精确小数位的浮点数。例如,我在.pdf文件中打印有关频率值的文本。原始数据位于string
中。
text "#{(@qsos.frequency.to_f).round(3)} MHz"
这将导致诸如7.13500
之类的原始文本转换为7.135
。如果我们尝试直接round
的值,它将返回错误,如string
所示。因此,在确定小数位之前,我们需要先将其转换为浮点数。
答案 5 :(得分:-1)
我会用:
<NavigationButton icon="{{is_dark , is_dark? 'res://ic_menu':'res://ic_menu2'}}" tap="{{ showSlideout }}" />
它是如何运作的?
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()
是Kernel类中的方法,所以
Float()
返回方法对象,允许Kernel.method(m)
向其发送call
值。如果成功,则返回返回的值,并且input
循环终止。如果它爆炸each
陷阱,则rescue ArgumentError
循环继续。如果循环结束而没有被each
短路,则Ruby返回return
。
答案 6 :(得分:-6)
你可以这样做:
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而不是错误。