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.
- checksums.yaml +7 -0
- data/lib/law_number_switch.rb +161 -0
- 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: []
|