すべての出会いが美しいとは限らない。すべての別れが悲しいとは言えない。

0%

【ruby】汉字数字排序

在制作地址系统时,遇到需要将地址的丁目大小从小到大排序显示的问题。由于数据库地址中的丁目信息是按照汉字数字的形式进行储存,而系统并非根据汉字数字所代表的数字大小来进行排序,因此只能通过简单的手动排序来进行处理。

通过hash进行转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def sort_by_number(array)
number_char = {
"零" => 0, "一" => 1, "二" => 2,
"三" => 3, "四" => 4, "五" => 5,
"六" => 6, "七" => 7, "八" => 8,
"九" => 9, "十" => 10
}

array.sort do |a, b|
number_char[a[0]] <=> number_char[b[0]]
end
end

array = %w(一丁目 四丁目 三丁目 二丁目)
# => ["一丁目", "四丁目", "三丁目", "二丁目"]

array.sort{ |a, b| a[0] <=> b[0] }
# => ["一丁目", "三丁目", "二丁目", "四丁目"]

sort_by_number array
# => ["一丁目", "二丁目", "三丁目", "四丁目"]

使用Gem ZenTol将汉字转化为数字后进行排序

https://github.com/yoshitsugu/zen_to_i

1
gem 'zen_to_i'

对上述代码进行简化

1
2
3
4
5
6
7
8
9
10
11
12
require 'zen_to_i'

def sort_by_number(array)
array.sort_by do |str|
str.zen_to_i.to_i
end
end

array = %w(一丁目 四丁目 十丁目 十三丁目 二丁目)
#=> ["一丁目", "四丁目", "十丁目", "十三丁目", "二丁目"]
sort_by_number array
#=> ["一丁目", "二丁目", "四丁目", "十丁目", "十三丁目"]