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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7b9a3107dc5ee3867a1d092450d4c842791a7d4e
4
- data.tar.gz: 40c9f1303f4e54b34c907d193dfabefef8bb1eb3
3
+ metadata.gz: 15281630573b8f147a5770a91faa725f25c7bddb
4
+ data.tar.gz: 6d0bc0ec60d0eac6bf3fd89382b0ae335c040310
5
5
  SHA512:
6
- metadata.gz: 3a5f904d202923319f57022e578ae0f0185c5180fc1687d2d123555e720349365dd63297147ba27a498d5b17b73a49a85285e96afcb0e428339fb0c3fa842c9a
7
- data.tar.gz: 2efc3974f2de5e12d5e042a654604e43e3ea46a3fa7a39b3264b5d4897d1a1dfd059b39c53e1946307f7573cdd8d98e9ce471c17f1ddc9fb7f781786964974a9
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
- def self.to_s(num)
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
- i == f ? i.to_s : f.to_s
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.ja(str)
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(4).to_a
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
- u = index > 0 ? units[index - 1] : ''
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
- TYPE_JA => '日本語表現'
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 UnitConverter
107
- UNIT_NONE = 1
108
- UNIT_MILLION = 2
109
-
110
- def self.get_num(value)
111
- # 数値部分を取得してBigDecimalとして返す
112
- unless value =~ /(\d+(?:\.\d+)?)/
113
- raise ArgumentError, 'cannot get number string'
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
- BigDecimal.new($1)
261
+ num
116
262
  end
117
-
118
- def self.get_unit(value)
119
- if value =~ /million/i
120
- return UNIT_MILLION
121
- end
122
- UNIT_NONE
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
- def self.calc_num(original_num, unit)
276
+ class LengthConverter < TypeConverter
277
+ def self.calc_length(original_num, type)
126
278
  num = original_num
127
- if unit == UNIT_MILLION
128
- # 100万倍
129
- num = original_num * 1000000
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
- original_num = get_num(value)
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
@@ -1,3 +1,3 @@
1
1
  module Libruby
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.0"
3
3
  end
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.2
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-12 00:00:00.000000000 Z
11
+ date: 2018-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler