libruby 0.5.0 → 0.6.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.rb +1 -1
- data/lib/libruby/version.rb +1 -1
- metadata +2 -3
- data/lib/libruby/unit_converter.rb +0 -353
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13a6df331173d0286798d8ade8551da59af68b63
|
4
|
+
data.tar.gz: 6ac1fd9ea118ae2dacd06a641452622545588574
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0956c37dc6b55f5f579ac03de1529519f601750cc6119f0eab905e0b382429a184d5388bebbcc85bf0243a7a19c7c22e306cae68c7d1d741e1000cc4deefee13'
|
7
|
+
data.tar.gz: da2a704f63207fd747a5ac5d43d2f034ecc756d2a6059d17a55e917d36e4c534a76362df2442b05aab1e927e886f93614f6fdc241aaad369bca1be18af4cb762
|
data/lib/libruby.rb
CHANGED
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.6.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-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,7 +76,6 @@ files:
|
|
76
76
|
- lib/libruby/misc_utils.rb
|
77
77
|
- lib/libruby/multi_io.rb
|
78
78
|
- lib/libruby/pair.rb
|
79
|
-
- lib/libruby/unit_converter.rb
|
80
79
|
- lib/libruby/version.rb
|
81
80
|
- libruby.gemspec
|
82
81
|
- test.sh
|
@@ -1,353 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
require 'bigdecimal'
|
3
|
-
|
4
|
-
module Libruby
|
5
|
-
|
6
|
-
class UnitConverterUtils
|
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)
|
21
|
-
#https://stackoverflow.com/questions/18533026/trim-a-trailing-0
|
22
|
-
# 単なる数値として返す。ただし少数以下のゼロは削除。
|
23
|
-
i, f = num.to_i, num.to_f
|
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
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.comma(str)
|
38
|
-
#http://rubytips86.hatenablog.com/entry/2014/03/28/153843
|
39
|
-
str.gsub(/(\d)(?=\d{3}+$)/, '\\1,') #=> "1,234,567,890"
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.to_comma_s(num)
|
43
|
-
s = to_s(num)
|
44
|
-
result = nil
|
45
|
-
if s =~ /(\d+)(\.\d+)/
|
46
|
-
result = comma($1) + $2
|
47
|
-
else
|
48
|
-
result = comma(s)
|
49
|
-
end
|
50
|
-
result
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.unit_str(str, column, units)
|
54
|
-
numbers = []
|
55
|
-
str.each_char {|num| numbers << num.to_i }
|
56
|
-
# 1234567
|
57
|
-
number_blocks = numbers.reverse.each_slice(column).to_a
|
58
|
-
# [7, 6, 5, 4], [3, 2, 1],
|
59
|
-
result = ''
|
60
|
-
number_blocks.each_with_index do |block, index|
|
61
|
-
unit_index = index - 1
|
62
|
-
u = unit_index >= 0 && unit_index < units.size ? units[unit_index] : ''
|
63
|
-
number_str = block.reverse.join
|
64
|
-
unless number_str =~ /^0+$/
|
65
|
-
result = number_str + u + result
|
66
|
-
end
|
67
|
-
end
|
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
|
90
|
-
end
|
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
|
-
|
98
|
-
def self.to_ja_s(num)
|
99
|
-
s = to_s(num)
|
100
|
-
if s =~ /(\d+)(\.\d+)/
|
101
|
-
result = ja($1) + $2
|
102
|
-
else
|
103
|
-
result = ja(s)
|
104
|
-
end
|
105
|
-
result
|
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
|
-
|
153
|
-
end
|
154
|
-
|
155
|
-
|
156
|
-
class UnitConverterResult
|
157
|
-
TYPE_ORIGINAL = 1
|
158
|
-
TYPE_NUMBER = 2
|
159
|
-
TYPE_EN = 3
|
160
|
-
TYPE_JA = 4
|
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
|
-
|
168
|
-
TYPE_LABELS = {
|
169
|
-
TYPE_ORIGINAL => 'オリジナル',
|
170
|
-
TYPE_NUMBER => '数値表現',
|
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 => 'メートル表現',
|
178
|
-
}
|
179
|
-
|
180
|
-
def self.find(results, type)
|
181
|
-
results.find{|result| result.type == type}
|
182
|
-
end
|
183
|
-
|
184
|
-
def self.create_original(value)
|
185
|
-
UnitConverterResult.new(TYPE_ORIGINAL, value)
|
186
|
-
end
|
187
|
-
|
188
|
-
def self.create_number(value)
|
189
|
-
UnitConverterResult.new(TYPE_NUMBER, UnitConverterUtils.to_comma_s(value))
|
190
|
-
end
|
191
|
-
|
192
|
-
def self.create_ja(value)
|
193
|
-
UnitConverterResult.new(TYPE_JA, UnitConverterUtils.to_ja_s(value))
|
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
|
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
|
-
|
229
|
-
def initialize(type, value)
|
230
|
-
@type = type
|
231
|
-
@value = value
|
232
|
-
end
|
233
|
-
attr_reader :type, :value
|
234
|
-
|
235
|
-
def type_label
|
236
|
-
TYPE_LABELS[@type]
|
237
|
-
end
|
238
|
-
|
239
|
-
def to_s
|
240
|
-
"#{@type}:#{type_label}:#{value}"
|
241
|
-
end
|
242
|
-
end
|
243
|
-
|
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
|
260
|
-
end
|
261
|
-
num
|
262
|
-
end
|
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
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
class LengthConverter < TypeConverter
|
277
|
-
def self.calc_length(original_num, type)
|
278
|
-
num = original_num
|
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)
|
288
|
-
end
|
289
|
-
num
|
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
|
341
|
-
|
342
|
-
def self.convert(value)
|
343
|
-
converter = UnitConverter.create_type_converter(value)
|
344
|
-
results = []
|
345
|
-
begin
|
346
|
-
results = converter.convert
|
347
|
-
rescue ArgumentError => e
|
348
|
-
puts e.to_s
|
349
|
-
end
|
350
|
-
results
|
351
|
-
end
|
352
|
-
end
|
353
|
-
end
|