丢弃第二个小数点后字符串变量中的所有内容

Discarding everything in a string variable after the second decimal

我有一个 Ruby 字符串变量,其值为 1.14.2.ab3-4.dl0.rhel 但是,我想丢弃小数点后第二位的所有内容,以便获得 1.14

的值

我正在使用以下命令: str.split(".")[0] 但是好像不行

当您在字符串上按 . 拆分时,您会得到:

['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 没有做出那个假设。)

你的说法也有歧义,"discard everything after the second decimal"。 @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 returns nil 如果所需的子字符串不存在,而 #2 returns "0.0" .只要 "0.0" 不是有效的子串,就可以使用其中任何一个来确定子串是否存在,如果存在,则 return 子串。

你也可以在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"