检查字符串是否为浮点数,消除0.0

时间:2012-10-10 03:12:27

标签: ruby-on-rails

我有一个使用Google地图地理编码器自动获取经度和经度的应用。我想为它编写自定义验证以与其他字段验证结合使用。以下是我的代码:

# lib/ext/string.rb
class String
  def valid_float?
    # The double negation turns this into an actual boolean true - if you're 
    # okay with "truthy" values (like 0.0), you can remove it.
    !!Float(self) rescue false
  end
end

# config/application.rb
require 'ext/string'

# post.rb
validate :check_point

def check_point
  if !(lat || lng).valid_float?
    ...
  end
end

在我的Post表单中,我使用firebug为asdf字段输入:lat,它返回了找不到valid_float?方法的错误。

然后我尝试一些调试:

abort(lat.to_s.valid_float?) # 0.0 true

在我:lat时,0.0字段中输入的数字以外的任何字符都会变为to_s。但是to_s是让valid_float?正常工作的唯一方法。为什么to_s会将所有文字转换为0.0

我也做了rails c来测试:

"1.234234".valid_float? # true
"asdf".valid_float? # false
"0.0".valid_float? # true

我必须做些什么才能让它发挥作用?感谢。

2 个答案:

答案 0 :(得分:0)

如果Post.lat和Post.long字段具有浮点类型,当您从表单输入中分配字符串值时,Rails会将它们转换为Float。
这些是你可以做出的一些改变:
- 在分配值之前验证控制器中的表格输入;
- 将数据类型更改为String并提供将值作为Float获取的方法;
- 更改lat =和lng =方法以验证输入

答案 1 :(得分:0)

def check_point
  if !(lat || lng).valid_float?
    ...
  end
end

这不会像你想象的那样奏效。首先计算括号之间的表达式,然后在结果上调用valid_float?。在ruby中lat || lng的结果,如果lat不是nil,则为lat;如果lat为nil,则为lng,因此您正在评估lat或lng中的一个是否可以转换为Float。

我会把它写成

def check_point
  if !lat.valid_float? || !lng.valid_float?
    ...
  end
end

我认为这比逻辑等同的形式更具有意向性!(a&& b)形式