删除字符串中的跟踪零

时间:2016-05-31 06:22:36

标签: ruby

我有一个字符串,我需要删除第二个小数位后的尾随零:

remove_zeros("1,2,3,4.2300")  #=> "1,2,3,4.23"
remove_zeros("1,2,3,4.20300") #=> "1,2,3,4.203"
remove_zeros("1,2,3,4.0200")  #=> "1,2,3,4.02"
remove_zeros("1,2,3,4.0000")  #=> "1,2,3,4.00"

缺少零,不必附加,即

remove_zeros("1,2,3,4.0")     #=> "1,2,3,4.0"

我怎么能在Ruby中这样做?我尝试转换为Float,但在遇到,时会终止字符串。我可以为此写任何正则表达式吗?

3 个答案:

答案 0 :(得分:1)

是的,可以使用正则表达式。

R = /
    \.     # match a decimal
    \d*?   # match one or more digits lazily
    \K     # forget all matches so far
    0+     # match one or more zeroes
    (?!\d) # do not match a digit (negative lookahead)
    /x     # free-spacing regex definition mode

def truncate_floats(str)
  str.gsub(R,"")
end

truncate_floats "1,2,3,4.2300"
  #=> "1,2,3,4.23" 
truncate_floats "1.34000,2,3,4.23000"
  #=> "1.34,2,3,4.23"
truncate_floats "1,2,3,4.23003500"
  #=> "1,2,3,4.230035" 
truncate_floats "1,2,3,4.3"
  #=> "1,2,3,4.3" 
truncate_floats "1,2,3,4.000"
  #=> "1,2,3,4." 

答案 1 :(得分:0)

> a = "1,2,3,4.2300"
> a.split(",").map{|e| e.include?(".") ? e.to_f : e}.join(",")
#=> "1,2,3,4.23" 
> a = "1,2,3,4.20300"
> a.split(",").map{|e| e.include?(".") ? e.to_f : e}.join(",")
#=> "1,2,3,4.203"

答案 2 :(得分:-2)

首先,您需要将字符串解析为其组件编号,然后删除每个编号上的尾随零。这可以通过以下方式完成:

1)将字符串拆分为','获取数字字符串数组

2)对于每个数字字符串,将其转换为Float,然后再转换为字符串:

#!/usr/bin/env ruby

def parse_and_trim(string)
  number_strings = string.split(',')
  number_strings.map { |s| Float(s).to_s }.join(',')
end

p parse_and_trim('1,2,3,4.2300') # => "1.0,2.0,3.0,4.23"

如果你真的想删除尾随的' .0'片段,你可以用这个替换脚本:

#!/usr/bin/env ruby

def parse_and_trim_2(string)
  original_strings = string.split(',')
  converted_strings = original_strings.map { |s| Float(s).to_s }
  trimmed_strings = converted_strings.map do |s|
    s.end_with?('.0') ? s[0..-3] : s
  end
  trimmed_strings.join(',')
end

p parse_and_trim_2('1,2,3,4.2300') # => "1,2,3,4.23"

这些当然可以更加简洁,但我已经使用中间变量来澄清发生了什么。