libruby 0.4.2 → 0.5.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 +4 -4
- data/lib/libruby/unit_converter.rb +241 -37
- data/lib/libruby/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15281630573b8f147a5770a91faa725f25c7bddb
|
4
|
+
data.tar.gz: 6d0bc0ec60d0eac6bf3fd89382b0ae335c040310
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 705e471696610af83010f1d870f986ee2f0804919b5fe97166d6f69adf43f1e16395439f78c7940a34c5c8ef6b633229c8d591882a8d7747c2ea233876c26c72
|
7
|
+
data.tar.gz: 3fc8582ba2f631a24e6d56814b3b5162fda552d09e47ad44a0b3de30618025ac23a183126f6b65a7e5f4c8a9f5077ce48c0c083110ae28fd1b885afddb79e8ca
|
@@ -4,11 +4,34 @@ require 'bigdecimal'
|
|
4
4
|
module Libruby
|
5
5
|
|
6
6
|
class UnitConverterUtils
|
7
|
-
|
7
|
+
MM_PER_INCH = 25.4
|
8
|
+
MM_PER_FEET = 304.8
|
9
|
+
MM_PER_CM = 10
|
10
|
+
MM_PER_M = 100
|
11
|
+
|
12
|
+
def self.get_num(value)
|
13
|
+
# 数値部分を取得してBigDecimalとして返す
|
14
|
+
unless value =~ /(\d+(?:\.\d+)?)/
|
15
|
+
raise ArgumentError, 'cannot get number string'
|
16
|
+
end
|
17
|
+
BigDecimal.new($1)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.to_s(num, limit = nil)
|
8
21
|
#https://stackoverflow.com/questions/18533026/trim-a-trailing-0
|
9
22
|
# 単なる数値として返す。ただし少数以下のゼロは削除。
|
10
23
|
i, f = num.to_i, num.to_f
|
11
|
-
|
24
|
+
result = nil
|
25
|
+
if i == f
|
26
|
+
result = i.to_s
|
27
|
+
else
|
28
|
+
if limit
|
29
|
+
result = sprintf("%.#{limit}f", f).sub(/0+$/, '')
|
30
|
+
else
|
31
|
+
result = f.to_s
|
32
|
+
end
|
33
|
+
end
|
34
|
+
result
|
12
35
|
end
|
13
36
|
|
14
37
|
def self.comma(str)
|
@@ -27,26 +50,51 @@ module Libruby
|
|
27
50
|
result
|
28
51
|
end
|
29
52
|
|
30
|
-
def self.
|
31
|
-
units = %w(万 億 兆 京 垓 予 穣 溝 澗 正 裁 極 恒河沙 阿僧祇 那由多 不可思議 無量大数 洛叉 倶胝)
|
32
|
-
|
53
|
+
def self.unit_str(str, column, units)
|
33
54
|
numbers = []
|
34
55
|
str.each_char {|num| numbers << num.to_i }
|
35
56
|
# 1234567
|
36
|
-
number_blocks = numbers.reverse.each_slice(
|
57
|
+
number_blocks = numbers.reverse.each_slice(column).to_a
|
37
58
|
# [7, 6, 5, 4], [3, 2, 1],
|
38
59
|
result = ''
|
39
60
|
number_blocks.each_with_index do |block, index|
|
40
|
-
|
41
|
-
|
61
|
+
unit_index = index - 1
|
62
|
+
u = unit_index >= 0 && unit_index < units.size ? units[unit_index] : ''
|
42
63
|
number_str = block.reverse.join
|
43
64
|
unless number_str =~ /^0+$/
|
44
65
|
result = number_str + u + result
|
45
66
|
end
|
46
67
|
end
|
47
|
-
result
|
68
|
+
result
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.ja(str)
|
72
|
+
units = %w(万 億 兆 京 垓 予 穣 溝 澗 正 裁 極 恒河沙 阿僧祇 那由多 不可思議 無量大数 洛叉 倶胝)
|
73
|
+
unit_str(str, 4, units)
|
74
|
+
|
75
|
+
# numbers = []
|
76
|
+
# str.each_char {|num| numbers << num.to_i }
|
77
|
+
# # 1234567
|
78
|
+
# number_blocks = numbers.reverse.each_slice(4).to_a
|
79
|
+
# # [7, 6, 5, 4], [3, 2, 1],
|
80
|
+
# result = ''
|
81
|
+
# number_blocks.each_with_index do |block, index|
|
82
|
+
# unit_index = index - 1
|
83
|
+
# u = unit_index > 0 && unit_index < units.size ? units[unit_index] : ''
|
84
|
+
# number_str = block.reverse.join
|
85
|
+
# unless number_str =~ /^0+$/
|
86
|
+
# result = number_str + u + result
|
87
|
+
# end
|
88
|
+
# end
|
89
|
+
# result
|
48
90
|
end
|
49
91
|
|
92
|
+
def self.en(str)
|
93
|
+
# https://phrase-phrase.me/ja/keyword/million-billion-trillion
|
94
|
+
units = %w(thousand million billion trillion quadrillion quintillion)
|
95
|
+
unit_str(str, 3, units)
|
96
|
+
end
|
97
|
+
|
50
98
|
def self.to_ja_s(num)
|
51
99
|
s = to_s(num)
|
52
100
|
if s =~ /(\d+)(\.\d+)/
|
@@ -56,6 +104,52 @@ module Libruby
|
|
56
104
|
end
|
57
105
|
result
|
58
106
|
end
|
107
|
+
|
108
|
+
def self.to_en_s(num)
|
109
|
+
s = to_s(num)
|
110
|
+
if s =~ /(\d+)(\.\d+)/
|
111
|
+
result = en($1) + $2
|
112
|
+
else
|
113
|
+
result = en(s)
|
114
|
+
end
|
115
|
+
result
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.inch_to_mm(num)
|
119
|
+
num * MM_PER_INCH
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.mm_to_inch(num)
|
123
|
+
num / MM_PER_INCH
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.feet_to_mm(num)
|
127
|
+
num * MM_PER_FEET
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.mm_to_feet(num)
|
131
|
+
num / MM_PER_FEET
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.cm_to_mm(num)
|
135
|
+
num * MM_PER_CM
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.mm_to_cm(num)
|
139
|
+
num / MM_PER_CM
|
140
|
+
end
|
141
|
+
|
142
|
+
def self.m_to_mm(num)
|
143
|
+
num * MM_PER_M
|
144
|
+
end
|
145
|
+
|
146
|
+
def self.mm_to_m(num)
|
147
|
+
num / MM_PER_M
|
148
|
+
end
|
149
|
+
|
150
|
+
# UNIT_LENGTH_INCH = 10
|
151
|
+
# UNIT_LENGTH_I
|
152
|
+
|
59
153
|
end
|
60
154
|
|
61
155
|
|
@@ -65,10 +159,22 @@ module Libruby
|
|
65
159
|
TYPE_EN = 3
|
66
160
|
TYPE_JA = 4
|
67
161
|
|
162
|
+
TYPE_LENGTH_INCH = 101
|
163
|
+
TYPE_LENGTH_FEET = 102
|
164
|
+
TYPE_LENGTH_MM = 111
|
165
|
+
TYPE_LENGTH_CM = 112
|
166
|
+
TYPE_LENGTH_M = 113
|
167
|
+
|
68
168
|
TYPE_LABELS = {
|
69
169
|
TYPE_ORIGINAL => 'オリジナル',
|
70
170
|
TYPE_NUMBER => '数値表現',
|
71
|
-
|
171
|
+
TYPE_EN => '英語表現',
|
172
|
+
TYPE_JA => '日本語表現',
|
173
|
+
TYPE_LENGTH_INCH => 'インチ表現',
|
174
|
+
TYPE_LENGTH_FEET => 'フィート表現',
|
175
|
+
TYPE_LENGTH_MM => 'ミリメートル表現',
|
176
|
+
TYPE_LENGTH_CM => 'センチメートル表現',
|
177
|
+
TYPE_LENGTH_M => 'メートル表現',
|
72
178
|
}
|
73
179
|
|
74
180
|
def self.find(results, type)
|
@@ -85,8 +191,41 @@ module Libruby
|
|
85
191
|
|
86
192
|
def self.create_ja(value)
|
87
193
|
UnitConverterResult.new(TYPE_JA, UnitConverterUtils.to_ja_s(value))
|
88
|
-
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def self.create_en(value)
|
197
|
+
UnitConverterResult.new(TYPE_EN, UnitConverterUtils.to_en_s(value))
|
198
|
+
end
|
199
|
+
|
200
|
+
def self.create_inch(value)
|
201
|
+
num = UnitConverterUtils.mm_to_inch(value)
|
202
|
+
str = UnitConverterUtils.to_s(num, 2) + "inch"
|
203
|
+
UnitConverterResult.new(TYPE_LENGTH_INCH, str)
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.create_feet(value)
|
207
|
+
num= UnitConverterUtils.mm_to_feet(value)
|
208
|
+
str = UnitConverterUtils.to_s(num, 2) + "feet"
|
209
|
+
UnitConverterResult.new(TYPE_LENGTH_FEET, str)
|
210
|
+
end
|
89
211
|
|
212
|
+
def self.create_mm(value)
|
213
|
+
str = UnitConverterUtils.to_s(value, 2) + "mm"
|
214
|
+
UnitConverterResult.new(TYPE_LENGTH_MM, str)
|
215
|
+
end
|
216
|
+
|
217
|
+
def self.create_cm(value)
|
218
|
+
num = UnitConverterUtils.mm_to_cm(value)
|
219
|
+
str = UnitConverterUtils.to_s(num, 2) + "cm"
|
220
|
+
UnitConverterResult.new(TYPE_LENGTH_CM, str)
|
221
|
+
end
|
222
|
+
|
223
|
+
def self.create_m(value)
|
224
|
+
num = UnitConverterUtils.mm_to_m(value)
|
225
|
+
str = UnitConverterUtils.to_s(num, 2)+ "m"
|
226
|
+
UnitConverterResult.new(TYPE_LENGTH_M, str)
|
227
|
+
end
|
228
|
+
|
90
229
|
def initialize(type, value)
|
91
230
|
@type = type
|
92
231
|
@value = value
|
@@ -101,45 +240,110 @@ module Libruby
|
|
101
240
|
"#{@type}:#{type_label}:#{value}"
|
102
241
|
end
|
103
242
|
end
|
104
|
-
|
105
243
|
|
106
|
-
class
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
244
|
+
class TypeConverter
|
245
|
+
def initialize(type, value)
|
246
|
+
@value = value
|
247
|
+
@type = type
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
class NumberConverter < TypeConverter
|
252
|
+
def self.calc_num(original_num, type)
|
253
|
+
num = original_num
|
254
|
+
if type == UnitConverter::UNIT_MILLION
|
255
|
+
# 100万倍
|
256
|
+
num = original_num * 1000000
|
257
|
+
elsif type == UnitConverter::UNIT_BILLION
|
258
|
+
# 10億倍
|
259
|
+
num = original_num * 1000000000
|
114
260
|
end
|
115
|
-
|
261
|
+
num
|
116
262
|
end
|
117
|
-
|
118
|
-
def
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
263
|
+
|
264
|
+
def convert
|
265
|
+
original_num = UnitConverterUtils.get_num(@value)
|
266
|
+
num = self.class.calc_num(original_num, @type)
|
267
|
+
results = []
|
268
|
+
results << UnitConverterResult.create_original(@value)
|
269
|
+
results << UnitConverterResult.create_number(num)
|
270
|
+
results << UnitConverterResult.create_en(num)
|
271
|
+
results << UnitConverterResult.create_ja(num)
|
272
|
+
results
|
123
273
|
end
|
274
|
+
end
|
124
275
|
|
125
|
-
|
276
|
+
class LengthConverter < TypeConverter
|
277
|
+
def self.calc_length(original_num, type)
|
126
278
|
num = original_num
|
127
|
-
if
|
128
|
-
|
129
|
-
|
279
|
+
if type == UnitConverter::UNIT_LENGTH_INCH
|
280
|
+
num = UnitConverterUtils.inch_to_mm(num)
|
281
|
+
elsif type == UnitConverter::UNIT_LENGTH_FEET
|
282
|
+
num = UnitConverterUtils.feet_to_mm(num)
|
283
|
+
elsif type == UnitConverter::UNIT_LENGTH_MM
|
284
|
+
elsif type == UnitConverter::UNIT_LENGTH_CM
|
285
|
+
num = UnitConverterUtils.cm_to_mm(num)
|
286
|
+
elsif type == UnitConverter::UNIT_LENGTH_M
|
287
|
+
num = UnitConverterUtils.m_to_mm(num)
|
130
288
|
end
|
131
289
|
num
|
132
290
|
end
|
291
|
+
|
292
|
+
def convert
|
293
|
+
original_num = UnitConverterUtils.get_num(@value)
|
294
|
+
num = self.class.calc_length(original_num, @type)
|
295
|
+
results = []
|
296
|
+
results << UnitConverterResult.create_original(@value)
|
297
|
+
results << UnitConverterResult.create_inch(num)
|
298
|
+
results << UnitConverterResult.create_feet(num)
|
299
|
+
results << UnitConverterResult.create_mm(num)
|
300
|
+
results << UnitConverterResult.create_cm(num)
|
301
|
+
results << UnitConverterResult.create_m(num)
|
302
|
+
results
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
class UnitConverter
|
307
|
+
# 数値コンバーター
|
308
|
+
UNIT_NONE = 1
|
309
|
+
UNIT_MILLION = 2
|
310
|
+
UNIT_BILLION = 3
|
311
|
+
|
312
|
+
# 長さコンバーター
|
313
|
+
UNIT_LENGTH = 100
|
314
|
+
UNIT_LENGTH_INCH = 101
|
315
|
+
UNIT_LENGTH_FEET = 102
|
316
|
+
UNIT_LENGTH_MM = 111
|
317
|
+
UNIT_LENGTH_CM = 112
|
318
|
+
UNIT_LENGTH_M = 113
|
319
|
+
|
320
|
+
def self.create_type_converter(value)
|
321
|
+
converter = nil
|
322
|
+
if value =~ /inch/i
|
323
|
+
converter = LengthConverter.new(UNIT_LENGTH_INCH, value)
|
324
|
+
elsif value =~ /feet/i
|
325
|
+
converter = LengthConverter.new(UNIT_LENGTH_FEET, value)
|
326
|
+
elsif value =~ /\d+\s*mm\b/
|
327
|
+
converter = LengthConverter.new(UNIT_LENGTH_MM, value)
|
328
|
+
elsif value =~ /\d+\s*cm\b/
|
329
|
+
converter = LengthConverter.new(UNIT_LENGTH_CM, value)
|
330
|
+
elsif value =~ /\d+\s*m\b/
|
331
|
+
converter = LengthConverter.new(UNIT_LENGTH_M, value)
|
332
|
+
elsif value =~ /million/i
|
333
|
+
converter = NumberConverter.new(UNIT_MILLION, value)
|
334
|
+
elsif value =~ /billion/i
|
335
|
+
converter = NumberConverter.new(UNIT_BILLION, value)
|
336
|
+
else
|
337
|
+
converter = NumberConverter.new(UNIT_NONE, value)
|
338
|
+
end
|
339
|
+
converter
|
340
|
+
end
|
133
341
|
|
134
342
|
def self.convert(value)
|
343
|
+
converter = UnitConverter.create_type_converter(value)
|
135
344
|
results = []
|
136
|
-
results << UnitConverterResult.create_original(value)
|
137
345
|
begin
|
138
|
-
|
139
|
-
unit = get_unit(value)
|
140
|
-
num = calc_num(original_num, unit)
|
141
|
-
results << UnitConverterResult.create_number(num)
|
142
|
-
results << UnitConverterResult.create_ja(num)
|
346
|
+
results = converter.convert
|
143
347
|
rescue ArgumentError => e
|
144
348
|
puts e.to_s
|
145
349
|
end
|
data/lib/libruby/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- src
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|