ruby 如何将字符串转换为整型或浮点型

z9smfwbn  于 12个月前  发布在  Ruby
关注(0)|答案(8)|浏览(144)

我有一个文本字段,用户可以输入一个数字,我希望能够将字符串转换为整数或浮点数的用户输入的基础上。在Ruby中有没有简单的方法可以做到这一点?
举例来说:

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

svujldwt1#

在字符串上使用to_ito_f

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

31moq8wy2#

这是一个常见的练习。可能有更优雅的方法来做到这一点,但这是最简单的一个班轮,我来了。

def to_number(value)
  return if value.blank?
  (value.to_f % 1) > 0 ? value.to_f : value.to_i
end

请记住,mod运算符并不完全精确。但在这种情况下,它应该对任何字符串化的数字都有效。

rnmwe5a2

rnmwe5a23#

从Ruby 2.6开始,全局Integer()Float()转换方法有一个exception参数,你可以利用它轻松地链接这两个方法:

def to_number(value)
  Integer(value, exception: false) || Float(value, exception: false)
end
n = to_number('123')
#=> 123
n.class
#=> Integer

n = to_number('123.99')
#=> 123.99
n.class
#=> Float

n = to_number('not a number')
#=> nil
n.class
#=> NilClass
x4shl7ld

x4shl7ld4#

如果你只是想避免在输入看起来像浮点数时显示小数,你可以将输入转换为浮点数,然后使用'%g'来显示数字。
你可能会得到意想不到的行为,或者不得不写一些逻辑来检查你的Numeric是Float还是Analog。

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)
mmvthczy

mmvthczy5#

这将用两个新方法扩展String,但你只需要对任何字符串调用#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

希望这对你有帮助!

mpgws1up

mpgws1up6#

您可以使用to_f函数和round将字符串转换为具有精确小数位的浮点数。例如,我打印的文本有关频率值在.pdf文件。原始数据为string

text "#{(@qsos.frequency.to_f).round(3)} MHz"

这将导致,原始文本如7.13500将转换为7.135。如果我们尝试直接将值round,它将返回错误,就像在string中一样。因此,我们需要先将其转换为float,然后再确定小数位。

vfwfrxfs

vfwfrxfs7#

我会使用:用途:

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类中的方法,因此

Kernel.method(m)

返回方法对象,允许call向其发送input值。如果成功,则返回值,each循环终止。如果它爆炸,rescue ArgumentError将其捕获,each循环继续。如果循环结束时没有被return短路,那么nil将被Ruby返回。

j8yoct9x

j8yoct9x8#

你可以这样做:

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而不是错误。

相关问题