easy_to_dictate_numbers 0.1.2 → 0.1.3

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
  SHA256:
3
- metadata.gz: cd9d609744cb38572a1749541f3dedcdb11b4bfd01f0287fb4169b76cd3897b5
4
- data.tar.gz: 8b518d7a45d962c5f446bb115e59fa2fae07fe0b08a9f759b79b8e9e20c59065
3
+ metadata.gz: 780e66635c5b14977a37fbd6136d0f818aceab29d48753184e1e5b0285502a61
4
+ data.tar.gz: 81a6072f1e4f44c34babb9288e7a3c0250763a1f22e49f67a9fbe1fb89dea852
5
5
  SHA512:
6
- metadata.gz: 1b33d240adb36083fb18526be8629854e7763a5b4a4d12ce75fc7635ebbe49584801bdeed70badc2c39e5f7b993910c54c0edb0bf80e8c2036d817ec3205f2ea
7
- data.tar.gz: 90be7ee0755d5a25e8573c31876d495ca509be1fd923e70d9cdb3a74db32909f46a5d0b9dc543a5d37ba7be7f2f5fb616dd31aab92f7149a8881af49a442edac
6
+ metadata.gz: b36b50433deb8b0778bc81ccc1a08a55b4cf202c60af927a88858eed1b9e90611e4e4f0081ba8f079a168f87ff58107ecdc15bf65894a78036982d8f2f20fafc
7
+ data.tar.gz: 90f026f4a7f1df4ea53d18625b0632925b2f46e31c0353c906e97b332f8360cf9faa0ab21c2be7721943022c668c638258114ceb5ceda9fe6c68e5643f8ca491
data/CHANGELOG.md CHANGED
@@ -11,3 +11,11 @@
11
11
  ## [0.1.2] - 2024-01-14
12
12
 
13
13
  - Moved extend primitives require to lib/easy_to_dictate_numbers.rb.
14
+
15
+ ## [0.1.3] - 2024-01-14
16
+
17
+ - Refactored to cover special cases:
18
+ - 100 -> one hundred
19
+ - 1000 -> one thousand
20
+ - 2334 -> twenty three thirty four
21
+ - Extended string with `to_dictable_number`
data/README.md CHANGED
@@ -30,9 +30,29 @@ To use EasyToDictateNumbers, simply call the `to_dictable` method on any `Intege
30
30
  require 'easy_to_dictate_numbers'
31
31
 
32
32
  puts 123.to_dictable
33
- # Output: "one two three"
33
+ # Output: "one twenty three"
34
+
35
+ puts "1243".to_dictable_number
36
+ # Output: "twelve forty three"
34
37
  ```
35
38
 
39
+ ## Example
40
+ List of samples from specs:
41
+
42
+ - `100` is converted to `one hundred`
43
+ - `123` is converted to `one twenty three`
44
+ - `'001'` is converted to `zero zero one`
45
+ - `'010'` is converted to `zero ten`
46
+ - `'0000'` is converted to `zero zero zero zero`
47
+ - `1000` is converted to `one thousand`
48
+ - `4321` is converted to `forty three twenty one`
49
+ - `4300` is converted to `forty three hundred`
50
+ - `'0001'` is converted to `zero zero zero one`
51
+ - `'0010'` is converted to `zero zero ten`
52
+ - `'0100'` is converted to `zero one hundred`
53
+
54
+ Please note that the numbers in quotes are treated as strings, which allows leading zeroes to be preserved.
55
+
36
56
  ## Development
37
57
 
38
58
  After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'lib/easy_to_dictate_numbers/version'
4
- require_relative 'lib/easy_to_dictate_numbers/extend_primitives'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = 'easy_to_dictate_numbers'
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EasyToDictateNumbers
4
+ class Error < StandardError; end
5
+
6
+ class NonNumberCharactersPresent < StandardError
7
+ def initialize
8
+ super('Non-number characters present')
9
+ end
10
+ end
11
+
12
+ class NumberToDictable
13
+ ONES = %w[zero one two three four five six seven eight nine].freeze
14
+ TEENS = %w[ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen].freeze
15
+ TENS = %w[twenty thirty forty fifty sixty seventy eighty ninety].freeze
16
+
17
+ class << self
18
+ def number_to_words(number_to_dictate)
19
+ number_as_string = number_to_dictate.to_s
20
+ validate_number(number_as_string)
21
+
22
+ leading_zeroes_words = leading_zeroes_to_words(number_as_string)
23
+
24
+ number_without_leading_zeroes = number_without_leading_zeroes(number_as_string)
25
+ number_without_leading_zeroes_words = number_without_leading_zeroes_to_words(number_without_leading_zeroes)
26
+
27
+ [leading_zeroes_words, number_without_leading_zeroes_words].reject(&:empty?).join(' ')
28
+ end
29
+
30
+ def validate_number(number_as_string)
31
+ raise NonNumberCharactersPresent if number_as_string.match?(/[^0-9]/)
32
+ end
33
+
34
+ def number_without_leading_zeroes_to_words(number_as_string)
35
+ case number_as_string.length
36
+ when 1 then one_digit_number_to_words(number_as_string)
37
+ when 2 then two_digit_number_to_words(number_as_string)
38
+ when 3 then three_digit_number_to_words(number_as_string)
39
+ when 4 then four_digit_number_to_words(number_as_string)
40
+ else large_number_to_words(number_as_string)
41
+ end
42
+ end
43
+
44
+ def repeat_zeroes(number_of_zeroes)
45
+ number_of_zeroes.times.map { ONES[0] }.join(' ')
46
+ end
47
+
48
+ def leading_zeroes_to_words(number_as_string)
49
+ leading_zeroes = number_as_string.match(/^0+/).to_s
50
+ leading_zeroes.empty? ? '' : repeat_zeroes(leading_zeroes.length)
51
+ end
52
+
53
+ def number_without_leading_zeroes(number_as_string)
54
+ number_as_string.sub(/^0+/, '')
55
+ end
56
+
57
+ def single_thousands_to_words(number_as_string)
58
+ number = number_as_string.to_i / 1000
59
+
60
+ [one_digit_number_to_words(number), 'thousand'].join(' ')
61
+ end
62
+
63
+ def one_digit_number_to_words(number_as_string)
64
+ number = number_as_string.to_i
65
+ return repeat_zeroes(1) if number.zero?
66
+
67
+ ONES[number]
68
+ end
69
+
70
+ def two_digit_number_to_words(number_as_string)
71
+ number = number_as_string.to_i
72
+
73
+ return repeat_zeroes(2) if number.zero?
74
+ return TEENS[number - 10] if number < 20
75
+
76
+ div, mod = number.divmod(10)
77
+ TENS[div - 2] + (mod.zero? ? '' : " #{ONES[mod]}")
78
+ end
79
+
80
+ def three_digit_number_to_words(number_as_string)
81
+ number = number_as_string.to_i
82
+ return repeat_zeroes(3) if number.zero?
83
+
84
+ first_digit, remainder = number.divmod(100)
85
+ words = [ONES[first_digit]]
86
+ words << (remainder.zero? ? 'hundred' : two_digit_number_to_words(remainder))
87
+ words.join(' ')
88
+ end
89
+
90
+ def four_digit_number_to_words(number_as_string)
91
+ number = number_as_string.to_i
92
+
93
+ return repeat_zeroes(4) if number.zero?
94
+ return single_thousands_to_words(number_as_string) if (number % 1000).zero?
95
+
96
+ high_pair = number_as_string[0..1]
97
+ low_pair = number_as_string[2..3]
98
+
99
+ [
100
+ two_digit_number_to_words(high_pair),
101
+ low_pair.to_i.zero? ? 'hundred' : two_digit_number_to_words(low_pair)
102
+ ].join(' ')
103
+ end
104
+
105
+ def large_number_to_words(number_as_string)
106
+ number_as_string.chars.map { |digit| ONES[digit.to_i] }.each_slice(3).map { |digit| digit.join(' ') }.join(', ')
107
+ end
108
+ end
109
+ end
110
+ end
@@ -5,3 +5,9 @@ class Integer
5
5
  EasyToDictateNumbers::NumberToDictable.number_to_words(self)
6
6
  end
7
7
  end
8
+
9
+ class String
10
+ def to_dictable_number
11
+ EasyToDictateNumbers::NumberToDictable.number_to_words(self)
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EasyToDictateNumbers
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.3'
5
5
  end
@@ -3,55 +3,4 @@
3
3
  # lib/easy_to_dictate_numbers.rb
4
4
  require_relative 'easy_to_dictate_numbers/version'
5
5
  require_relative 'easy_to_dictate_numbers/extend_primitives'
6
-
7
- module EasyToDictateNumbers
8
- class Error < StandardError; end
9
-
10
- class NumberToDictable
11
- ONES = %w[zero one two three four five six seven eight nine].freeze
12
- TEENS = %w[ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen].freeze
13
- TENS = %w[twenty thirty forty fifty sixty seventy eighty ninety].freeze
14
-
15
- def self.number_to_words(number)
16
- validate_number(number)
17
-
18
- case number.digits.count
19
- when 1, 2 then two_digit_number_to_words(number)
20
- when 3 then three_digit_number_to_words(number)
21
- when 4 then four_digit_number_to_words(number)
22
- else large_number_to_words(number)
23
- end
24
- end
25
-
26
- def self.validate_number(number)
27
- raise Error, 'Please enter a non-negative number' if number.negative?
28
- end
29
-
30
- def self.two_digit_number_to_words(number)
31
- return ONES[number] if number < 10
32
- return TEENS[number - 10] if number < 20
33
-
34
- div, mod = number.divmod(10)
35
- TENS[div - 2] + (mod.zero? ? '' : " #{ONES[mod]}")
36
- end
37
-
38
- def self.three_digit_number_to_words(number)
39
- first_digit, remainder = number.divmod(100)
40
- words = [ONES[first_digit], 'hundred']
41
- words << two_digit_number_to_words(remainder) unless remainder.zero?
42
- words.join(' ')
43
- end
44
-
45
- def self.four_digit_number_to_words(number)
46
- high_pair, low_pair = number.divmod(100)
47
- words = []
48
- words << "#{two_digit_number_to_words(high_pair)} hundred" unless high_pair.zero?
49
- words << two_digit_number_to_words(low_pair) unless low_pair.zero? || high_pair.zero?
50
- words.join(' ')
51
- end
52
-
53
- def self.large_number_to_words(number)
54
- number.to_s.chars.map { |digit| ONES[digit.to_i] }.each_slice(3).map { |digit| digit.join(' ') }.join(', ')
55
- end
56
- end
57
- end
6
+ require_relative 'easy_to_dictate_numbers/easy_to_dictate_numbers'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easy_to_dictate_numbers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matias Verges
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-14 00:00:00.000000000 Z
11
+ date: 2024-01-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Transform numbers into words to dictate them easily.For example 1234
14
14
  becomes twelve thirty four and 123456 becomes 'one two three, four five six'
@@ -26,6 +26,7 @@ files:
26
26
  - Rakefile
27
27
  - easy_to_dictate_numbers.gemspec
28
28
  - lib/easy_to_dictate_numbers.rb
29
+ - lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb
29
30
  - lib/easy_to_dictate_numbers/extend_primitives.rb
30
31
  - lib/easy_to_dictate_numbers/version.rb
31
32
  - sig/easy_to_dictate_numbers.rbs