libruby 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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