在Ruby中重新格式化一串数字

时间:2012-10-11 06:47:36

标签: ruby string formatting

在我们的应用程序中,我们有一个数字字符串(存储为字符串)用于注册号码(澳大利亚商业号码或澳大利亚公司号码,类似于SSN),例如:

"98123123999"

当我们在Web应用程序中显示此信息时,能够将数字重新格式化为更具可读性将是很好的,例如:

98 123 123 999

在红宝石中,我到目前为止的最佳解决方案是:

  1. 检查长度
  2. 使用切片运算符格式化字符串:[a[0,2], a[2,3], a[5,3], a[8, 3]].join(" ")
  3. 然而,这闻起来似乎不对。

    做什么看似如此简单的最佳方法是什么?

    编辑:我还应该注意,数字字符串可以带有前缀0(例如“012345678901”),因此无法将其解析为整数,然后使用格式字符串。

5 个答案:

答案 0 :(得分:4)

使用

a = "98123123999"
=> "98123123999" 
b = a.split('').insert(2, ' ').insert(6, ' ').insert(10, ' ')
=> "9", "8", " ", "1", "2", "3", " ", "1", "2", "3", " ", "9", "9", "9"] 
b = a.split('').insert(2, ' ').insert(6, ' ').insert(10, ' ').join
=> "98 123 123 999" 

或者如果你想要修改字符串

a = "98123123999"
=> "98123123999" 
b = a.insert(2, ' ').insert(6, ' ').insert(10, ' ')
=> "98 123 123 999" 
a
=> "98 123 123 999" 

答案 1 :(得分:4)

从更通用的角度来看,如果您使用rails,则可以使用number_with_delimiter(number, delimiter=",", separator=".")

否则,可能只是根据source code写一些东西。

number.to_s.gsub!(/(\d)(?=(\d{3})+(?!\d))/, "\\1#{' '}")

>> 1234567890.to_s.gsub!(/(\d)(?=(\d{3})+(?!\d))/, "\\1#{' '}")
=> "1 234 567 890"

答案 2 :(得分:1)

试试这个:

def format_digit(s, acc="")
  if s.size > 3
    new_acc = s[-3..-1] + " " +acc
    format_digit(s[0...-3], new_acc)
  else
    s + " " + acc
  end
end

s = "98123123999"
puts format_digit(s)

答案 3 :(得分:1)

不确定这是否符合您的需求,因为两位数字组最终而不是开头......

"98123123999".scan(/.{1,3}/).join(' ') #=> "981 231 239 99"

答案 4 :(得分:0)

str           = "098123123999"
formatted_arr = []

if str.length % 3 == 0
    (str.length/3).times { formatted_arr << str.slice!(0..2) }
else
    formatted_arr << str.slice!(0..str.length % 3 - 1)
    (str.length/3).times { formatted_arr << str.slice!(0..2) }
end

puts formatted_arr.join(" ") # 098 123 123 999