【问题标题】:Discarding everything in a string variable after the second decimal在小数点后第二位丢弃字符串变量中的所有内容
【发布时间】: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】:

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

    ['1', '14', '2', 'ab3-4', 'dl0', 'rhel']
    

    从这里你可以得到前两个按句点连接的项目:

    str.split(".")[0..1].join(".")
    
    # or
    str.split(".").first(2).join(".")
    

    【讨论】:

      【解决方案2】:

      使用正则表达式,您可以只查找第一个带有 2 位小数的数字:

      "1.14.2.ab3-4.dl0.rhel"[/\d+\.\d{2}/]
      #=> "1.14"
      

      【讨论】:

        【解决方案3】:

        @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" 不是有效的子字符串,就可以使用其中任一来确定子字符串是否存在,如果存在,则返回子字符串。

        【讨论】:

          【解决方案4】:

          您也可以使用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#[]有什么优势?
          • 我不认为有任何优势,只是获得相同结果的另一种方式。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多