1

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

"98123123999"

当我们在我们的 Web 应用程序中显示这些信息时,能够重新格式化数字以使其更具可读性会很好,例如:

98 123 123 999

在红宝石中,我迄今为止最好的解决方案是:

  1. 检查长度
  2. 使用切片运算符格式化字符串:[a[0,2], a[2,3], a[5,3], a[8, 3]].join(" ")

然而,这闻起来并不正确。

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

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

4

5 回答 5

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" 
于 2012-10-11T07:03:03.880 回答
4

对于更通用的观点,如果您使用 rails,则可以使用number_with_delimiter(number, delimiter=",", separator=".").

否则,也许只是根据它的源代码写一些东西。

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

>> 1234567890.to_s.gsub!(/(\d)(?=(\d{3})+(?!\d))/, "\\1#{' '}")
=> "1 234 567 890"
于 2012-10-11T07:11:38.893 回答
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)
于 2012-10-11T07:01:35.653 回答
1

不确定这是否适合您的需求,因为两位数的组在末尾而不是开头...

"98123123999".scan(/.{1,3}/).join(' ') #=> "981 231 239 99"
于 2012-10-11T08:06:21.113 回答
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
于 2012-10-11T07:13:40.927 回答