Ruby on Rails - 计算数字范围的大小

时间:2014-03-04 10:48:16

标签: ruby-on-rails ruby ruby-on-rails-2

原谅我缺乏代码,但我无法找到实现以下目标的最佳方法:

两个字符串(由于前导0而存储为字符串 - 它们是电话号码):

a = '0123456700'
b = '0123456750'

我正在尝试找到一种方法将它们写为范围如下

0123456700 - 750

而不是

0123456700 - 0123456750

我现在有。

它并不像获取b的最后3位数那样简单,因为范围可能会有所不同,也许最多可达4位数,因此我正在努力寻找能够做到这一点的最佳方法。

3 个答案:

答案 0 :(得分:3)

我会查找第一个不相等的字符对的索引:

a = '0123456700'
b = '0123456750'

index = a.chars.zip(b.chars).index { |x, y| x != y }
#=> 8

并使用以下内容提取后缀:

"#{a} - #{b[index..-1]}" if index
#=> "0123456700 - 50"

答案 1 :(得分:2)

从我的个人图书馆(简化):

def common_prefix first, second
  i = 0
  loop{break unless first[i] and second[i] == first[i]; i += 1}
  first[0, i]
end

a = "0123456700"
b = "0123456750"
c = "0123457750"

common_prefix(a, b)
# => "01234567"

"#{a} - #{b.sub(common_prefix(a, b), "")}"
# => "0123456700 - 50"

"#{a} - #{c.sub(common_prefix(a, c), "")}"
# => "0123456700 - 7750"

请注意。只有在假设所有字符串都正确填充0并且长度相同的情况下,这才能正常工作。

答案 2 :(得分:2)

这是一个返回范围的方法:

def my_range(a, b)
  a = a.delete(" ") # remove all spaces from string                                                                                            
  b = b.delete(" ")
  a, b = b, a if a.to_i > b.to_i # a is always smaller than b                                                                                  
  ai, bi = a.to_i, b.to_i
  pow = 1
  while ai > 1
    pow += 1
    len = pow if ai % 10 != bi % 10
    ai /= 10
    bi /= 10
  end
  a + " - " + b[-len..-1]
end

puts my_range("0123456700", "0123456750")   # 0123456700 - 750
puts my_range("0123456669", "0123456675")   # 0123456669 - 675
puts my_range("0123400200", "0123500200")   # 0123400200 - 3500200
puts my_range("012 345 678", "01 235 0521") # 012345678 - 350521