law_number_switch 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/law_number_switch.rb +161 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e11ad319672aab818652e84aaabcc9123734f6f9
4
+ data.tar.gz: 0681c1433ed5621d468bda1a19fb3aea5afee806
5
+ SHA512:
6
+ metadata.gz: 73a95497edb3e4cccc68b1590c5a13dae75e1b7e5d6737485a9393384191e2d8062dc734732adb187b1f0a9d60199f756ccbebf569373ce0ef772a4c1e8ee0fd
7
+ data.tar.gz: 55c4157b5785258d1e6f84b10a9aa6de0802ac00edf4408b486afae75ed1766e5277b927963c4c45fd4c199fd05947d4017630af1f5c9a15d0fb09a6655daedb
@@ -0,0 +1,161 @@
1
+ module LawNumberSwitch
2
+ CN_NUMBER = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" ]
3
+ CN_UNIT = ["", "十", "百", "千" ]
4
+ CN_UNIT_BIG = ["", "萬", "億" ]
5
+
6
+ def to_cn_number
7
+ string = self.to_cn_number_oneten
8
+ if string =~ /一十/
9
+ string.gsub(/一十/, '十')
10
+ else
11
+ string
12
+ end
13
+ end
14
+
15
+ def to_cn_number_oneten
16
+ if self =~ /-/
17
+ dash_words
18
+ else
19
+ int_words
20
+ end
21
+ end
22
+
23
+ def int_words
24
+ n_s = self.to_i.abs
25
+ return "零" if n_s == 0
26
+
27
+ num_arr = n_s.to_s.split('').reverse
28
+ rst_arr = []
29
+
30
+ writable = -1
31
+ #1: 都需要寫;
32
+ #0: 寫一個零,後面的千不用寫;
33
+ #-1:不需要寫千,也不需要寫零;
34
+
35
+ num_arr.each_with_index do |value, index|
36
+ writable = -1 if index%4 == 0
37
+ unit_big = (index%4 == 0) ? CN_UNIT_BIG[index/4] : ""
38
+ number = CN_NUMBER[value.to_i]
39
+
40
+ if value.to_i == 0
41
+ unit = (writable == 1) ? "零" : ""
42
+ writable = (writable == 1) ? 0 : -1
43
+ else
44
+ unit = CN_UNIT[index%4]
45
+ writable = 1
46
+ end
47
+
48
+ rst_arr << number + unit + unit_big
49
+ end
50
+
51
+ rst_arr.reverse.join
52
+ end
53
+
54
+ def dash_words
55
+ n_arr = []
56
+ front = self.scan(/\d*-/)
57
+ behind = self.scan(/-\d*$/)[0]
58
+
59
+ front.each do |f|
60
+ f_n = f.int_words + "之"
61
+ n_arr << f_n
62
+ end
63
+
64
+ b_n = behind.int_words
65
+ n_arr << b_n
66
+
67
+ n_arr.join
68
+ end
69
+
70
+ CN_NUMS = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
71
+ CN_DECS = ["十", "百", "千", "萬", "億"]
72
+ CN_NUMS_MAP = {'〇' => 0, '一' => 1, '二' => 2, '三' => 3, '四' => 4, '五' => 5,
73
+ '六' => 6, '七' => 7, '八' => 8, '九' => 9, '零' => 0}
74
+ CN_DECS_MAP = {'個' => 1, '十' => 10, '百' => 100, '千' => 1000, '萬' => 10000, '億' => 100000000}
75
+
76
+ def to_number
77
+ string = self
78
+ CN_DECS.each do |d|
79
+ no_ten = d + '十'
80
+ one_ten = d + '一' + '十'
81
+ if string =~ Regexp.new(no_ten)
82
+ string = self.gsub(Regexp.new(no_ten), one_ten)
83
+ end
84
+ end
85
+ string.to_number_oneten
86
+ end
87
+
88
+ def to_number_oneten
89
+ if self =~ /之/
90
+ dash_number
91
+ else
92
+ int_number
93
+ end
94
+ end
95
+
96
+ def int_number
97
+ num_str = ''
98
+ last = nil
99
+ self.scan(/./) do |c|
100
+ num_str += c if c != '零'
101
+ last = c
102
+ end
103
+ if num_str =~ /^十/
104
+ num_str = '一' + num_str
105
+ end
106
+
107
+ sums = []
108
+ temp_sum = 0
109
+ last_num = 0
110
+ num_str.scan(/./) do |ch|
111
+ if num = CN_NUMS_MAP[ch]
112
+ last_num = num
113
+ else
114
+ dec = CN_DECS_MAP[ch]
115
+ if dec < 10000
116
+ temp_sum += last_num * dec
117
+ else
118
+ #find back for the one that exceeds current dec
119
+ sums.each_with_index do |x, i|
120
+ if x < dec * 10 #10 is here for situation like 兩億億
121
+ sums[i] = x * dec
122
+ else
123
+ break
124
+ end
125
+ end
126
+ temp_sum += last_num
127
+ sums << temp_sum * dec
128
+ temp_sum = 0
129
+ end
130
+ last_num = 0
131
+ end
132
+ end
133
+ sums << temp_sum + last_num
134
+
135
+ sum = 0
136
+ sums.each do |x|
137
+ sum += x
138
+ end
139
+ sum.to_s
140
+ end
141
+
142
+ def dash_number
143
+ w_arr = []
144
+ front = self.scan(/[^之]*之/)
145
+ behind = self.scan(/[^之]*.$/)[0]
146
+
147
+ front.each do |f|
148
+ f.pop
149
+ f_w = f.int_number + '-'
150
+ w_arr << f_w
151
+ end
152
+
153
+ behind.shift
154
+ b_w = behind.int_number
155
+ w_arr << b_w
156
+ w_arr.join
157
+ end
158
+
159
+ end
160
+
161
+ String.include LawNumberSwitch
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: law_number_switch
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - GaussJay
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-09-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Swith chinese law number string and arabic numerals string to each other.
14
+ email:
15
+ - gaussjay@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/law_number_switch.rb
21
+ homepage: ''
22
+ licenses: []
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.4.5.1
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: law_number_switch
44
+ test_files: []