在我们的应用程序中,我们有一个数字字符串(存储为字符串)用于注册号码(澳大利亚商业号码或澳大利亚公司号码,类似于SSN),例如:
"98123123999"
当我们在Web应用程序中显示此信息时,能够将数字重新格式化为更具可读性将是很好的,例如:
98 123 123 999
在红宝石中,我到目前为止的最佳解决方案是:
[a[0,2], a[2,3], a[5,3], a[8, 3]].join(" ")
然而,这闻起来似乎不对。
做什么看似如此简单的最佳方法是什么?
编辑:我还应该注意,数字字符串可以带有前缀0(例如“012345678901”),因此无法将其解析为整数,然后使用格式字符串。
答案 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