【发布时间】:2017-01-05 20:52:45
【问题描述】:
我有一个值为 1.14.2.ab3-4.dl0.rhel 的 Ruby 字符串变量
但是,我想丢弃小数点后的所有内容,以便获得 1.14 的值
我正在使用以下命令:
str.split(".")[0] 但它似乎不起作用
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 rubygems
我有一个值为 1.14.2.ab3-4.dl0.rhel 的 Ruby 字符串变量
但是,我想丢弃小数点后的所有内容,以便获得 1.14 的值
我正在使用以下命令:
str.split(".")[0] 但它似乎不起作用
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 rubygems
当您在字符串上按. 拆分时,您会得到:
['1', '14', '2', 'ab3-4', 'dl0', 'rhel']
从这里你可以得到前两个按句点连接的项目:
str.split(".")[0..1].join(".")
# or
str.split(".").first(2).join(".")
【讨论】:
使用正则表达式,您可以只查找第一个带有 2 位小数的数字:
"1.14.2.ab3-4.dl0.rhel"[/\d+\.\d{2}/]
#=> "1.14"
【讨论】:
@maxple 的答案仅在感兴趣的子字符串位于字符串开头时才有效。由于这不是规范的一部分(仅在示例中),我认为这不是一个合理的假设。 (@Eric 没有做出这样的假设。)
您的陈述也有歧义,“丢弃小数点后的所有内容”。 @maxple 将其解释为第二个小数点之后(但也丢弃了第二个小数点),而@Eric 假设它意味着第二个小数点之后。当问题不精确时会发生这种情况。
如果子字符串位于字符串的开头,并且您的意思是丢弃第二个小数点和后面的所有内容,这里有两种方法可以做到这一点。
str = "1.14.2.ab3-4.dl0.rhel"
1.修改@Eric 的正则表达式:
str[/\A\d+\.\d+/]
#=> "1.14"
2.将字符串转换为浮点数,然后再转换回字符串:
str.to_f.to_s
#=> "1.14"
#1 如果所需的子字符串不存在则返回nil,而#2 返回"0.0"。只要"0.0" 不是有效的子字符串,就可以使用其中任一来确定子字符串是否存在,如果存在,则返回子字符串。
【讨论】:
您也可以使用String中的分区方法:https://ruby-doc.org/core-2.2.0/String.html#method-i-partition
"1.14.2.ab3-4.dl0.rhel".partition(/\d+\.\d{2}/)[1]
=> "1.14"
【讨论】:
String#partition比Eric使用String#[]有什么优势?