我的ruby命令是
"980,323,344.00".to_i
为什么它返回980而不是980323344?
答案 0 :(得分:6)
您可以这样做:
"980,323,344.00".delete(',').to_i
here解释了您对to_i
的方法调用未按预期返回的原因,并引用了该方法:
返回将str中的前导字符解释为整数基数(2到36之间)的结果。有效数字后面的多余字符。
在您的情况下,外来字符将是以980
结尾的逗号字符,这是您看到返回980
的原因
答案 1 :(得分:3)
在ruby中,在字符串上调用to_i
将在可能的情况下从字符串的开头截断。
number_string = '980,323,344.00'
number_string.delete(',').to_i
#=> 980323344
"123abc".to_i
#=> 123
如果要添加下划线以使更长的数字更易读,则可以在常规逗号为书面数字的地方使用下划线。
"980_323_344.00".to_i
#=> 980323344
答案 2 :(得分:2)
to_i
的文档可能会引起误解:
返回将 str 中的前导字符解释为整数基 base (介于2到36之间)的结果
“解释” 并不意味着它试图解析各种数字格式(就像Date.parse
一样用于日期格式)。这意味着它将在Ruby中(根据给定的基数)查找有效的integer literal。例如:
1234. #=> 1234
'1234'.to_i #=> 1234
1_234. #=> 1234
'1_234'.to_i. #=> 1234
0d1234 #=> 1234
'0d1234'.to_i #=> 1234
0x04D2 #=> 1234
'0x04D2'.to_i(16) #=> 1234
您的整个输入不是有效的整数文字:(Ruby不喜欢,
)
980,323,344.00
# SyntaxError (syntax error, unexpected ',', expecting end-of-input)
# 980,323,344.00
# ^
但是以有效的整数文字开始。这就是秒句起作用的地方:
有效数字后的多余字符将被忽略。
结果是980
–前导字符,这些前导字符形成一个有效的整数,并转换为整数。
如果字符串始终采用这种格式,则可以delete
冒犯逗号,并通过to_i
运行结果,而忽略尾随的.00
:
'980,323,344.00'.delete(',') #=> "980323344.00"
'980,323,344.00'.delete(',').to_i #=> 980323344
否则,可以在转换前使用正则表达式检查其格式:
input = '980,323,344.00'
number = case input
when /\A\d{1,3}(,\d{3})*\.00\z/
input.delete(',').to_i
when /other format/
# other conversion
end
如果要处理货币值,则应考虑使用money gem及其附加的monetize来解析格式值:
amount = Monetize.parse('980,323,344.00')
#=> #<Money fractional:98032334400 currency:USD>
amount.format
#=> "$980.323.344,00"
请注意,format
需要i18n,因此上面的示例可能需要进行一些设置。