我被困在下面的函数中,将Float转换为Integer-它从未出现在v.to_int
(对不起,我是Ruby的新手,它是猴子编码)。
我要解决的问题是来自MongoDB的数据应该是Integer类型,但有时输入流中有Floats(见下文)。
我要实现的目标-当Integer期望在特定位置上时-强制转换并截断Integer无论那里出现了什么(通常是Float)。
def transform_primitive(v, type=nil)
case v
when BSON::ObjectId, Symbol
v.to_s
when BSON::Binary
if type.downcase == 'uuid'
v.data.to_s.unpack("H*").first
else
Sequel::SQL::Blob.new(v.data.to_s)
end
when Mongo::DBRef
v.id.to_s
when Integer
v.to_int
else
v
end
end
输入如下所示,因此最后一个值150.0
应该是150
[ "EUR", 20]
[ "EUR", 30]
[ "EUR", 450]
[ "EUR", 22]
[ "EUR", 150.0]
使用的Ruby 2.7 MongoDB 3.4 源库(MoSQL)不是我的,存储库是here
答案 0 :(得分:5)
要同时匹配整数和浮点数,您需要将when条件更改为:
GHCi> align [1,2] [3,9,27]
[These 1 3,These 2 9,That 27]
GHCi> align [3,9,27] [1,2]
[These 3 1,These 9 2,This 27]
或者只是when Integer, Float
,因为when Float
已经涵盖了整数情况。
观察:
else
或者,您可以使用数字类:
3.is_a? Integer #=> true
3.is_a? Float #=> false
3.4.is_a? Integer #=> false
3.4.is_a? Float #=> true
请注意,数字不仅包括整数和浮点数,还包括复数和有理数:
when Numeric
我认为在您的情况下应该可以,但只需指出。
顺便说一句,您可能要使用(1+0i).is_a? Numeric
而不是to_int
:
round