如何将String转换为Integer或Float

时间:2016-11-21 13:13:56

标签: ruby

我有一个文本字段,用户可以输入一个数字,我希望能够根据用户输入将字符串转换为整数或浮点数。在Ruby中有一种简单的方法吗?

例如:

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

7 个答案:

答案 0 :(得分:4)

在字符串

上使用to_ito_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而不是错误。