Ruby .to_i没有按预期返回完整的整数

时间:2019-03-25 17:49:03

标签: ruby

我的ruby命令是

"980,323,344.00".to_i

为什么它返回980而不是980323344?

3 个答案:

答案 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,因此上面的示例可能需要进行一些设置。