numbers_in_words 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +2 -0
  3. data/.gitignore +1 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +35 -1148
  6. data/.travis.yml +14 -4
  7. data/Gemfile +4 -1
  8. data/README.md +6 -43
  9. data/Rakefile +3 -1
  10. data/bin/spec +0 -0
  11. data/lib/numbers_in_words.rb +44 -19
  12. data/lib/numbers_in_words/duck_punch.rb +12 -8
  13. data/lib/numbers_in_words/exceptional_numbers.rb +115 -0
  14. data/lib/numbers_in_words/fraction.rb +136 -0
  15. data/lib/numbers_in_words/number_group.rb +34 -25
  16. data/lib/numbers_in_words/parsing/fraction_parsing.rb +34 -0
  17. data/lib/numbers_in_words/parsing/number_parser.rb +98 -0
  18. data/lib/numbers_in_words/parsing/pair_parsing.rb +64 -0
  19. data/lib/numbers_in_words/parsing/parse_fractions.rb +45 -0
  20. data/lib/numbers_in_words/parsing/parse_individual_number.rb +68 -0
  21. data/lib/numbers_in_words/parsing/parse_status.rb +17 -0
  22. data/lib/numbers_in_words/parsing/special.rb +67 -0
  23. data/lib/numbers_in_words/parsing/to_number.rb +77 -0
  24. data/lib/numbers_in_words/powers_of_ten.rb +49 -0
  25. data/lib/numbers_in_words/to_word.rb +78 -13
  26. data/lib/numbers_in_words/version.rb +3 -1
  27. data/lib/numbers_in_words/writer.rb +69 -0
  28. data/numbers_in_words.gemspec +14 -13
  29. data/spec/exceptional_numbers_spec.rb +26 -0
  30. data/spec/fraction_spec.rb +152 -0
  31. data/spec/fractions_spec.rb +31 -0
  32. data/spec/non_monkey_patch_spec.rb +40 -15
  33. data/spec/number_group_spec.rb +12 -12
  34. data/spec/number_parser_spec.rb +31 -0
  35. data/spec/numbers_in_words_spec.rb +63 -70
  36. data/spec/numerical_strings_spec.rb +35 -0
  37. data/spec/spec_helper.rb +24 -4
  38. data/spec/to_word_spec.rb +18 -0
  39. data/spec/words_in_numbers_spec.rb +133 -116
  40. data/spec/writer_spec.rb +26 -0
  41. data/spec/years_spec.rb +27 -0
  42. metadata +49 -27
  43. data/lib/numbers_in_words/english/constants.rb +0 -93
  44. data/lib/numbers_in_words/english/language_writer_english.rb +0 -109
  45. data/lib/numbers_in_words/language_writer.rb +0 -31
  46. data/lib/numbers_in_words/number_parser.rb +0 -81
  47. data/lib/numbers_in_words/to_number.rb +0 -82
  48. data/spec/language_writer_spec.rb +0 -23
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe NumbersInWords do
4
+ FRACTION_EXAMPLES = {
5
+ 'half' => 0.5,
6
+ 'a half' => 0.5,
7
+ 'one half' => 0.5,
8
+ 'two halves' => 1.0,
9
+ 'three halves' => 1.5,
10
+ 'three quarters' => 0.75,
11
+ 'three fifths' => 3 / 5.0,
12
+ 'seven fifteenths' => 7 / 15.0
13
+ }.freeze
14
+
15
+ PENDING = {
16
+ 'twenty and three fifteenths' => 20 + 3 / 15.0,
17
+ 'three ninety-sevenths' => 3 / 97.0
18
+ }.freeze
19
+
20
+ FRACTION_EXAMPLES.each do |string, float|
21
+ it "#{string} == #{float}" do
22
+ expect(string.in_numbers).to eql(float)
23
+ end
24
+ end
25
+
26
+ PENDING.each do |string, float|
27
+ pending "#{string} == #{float}" do
28
+ expect(string.in_numbers).to eql(float)
29
+ end
30
+ end
31
+ end
@@ -1,26 +1,51 @@
1
- require 'numbers_in_words'
1
+ # frozen_string_literal: true
2
2
 
3
- describe "NumbersInWords" do
4
- describe ".in_words" do
3
+ require 'spec_helper'
4
+
5
+ describe 'NumbersInWords' do # rubocop: disable Metrics/BlockLength
6
+ describe '.in_words' do
5
7
  it do
6
- expect(NumbersInWords.in_words(100)).to eq "one hundred"
7
- expect(NumbersInWords.in_words(-100)).to eq "minus one hundred"
8
- expect(NumbersInWords.in_words(24)).to eq "twenty four"
9
- expect(NumbersInWords.in_words(1.2)).to eq "one point two"
10
- expect(NumbersInWords.in_words(100*10**100)).to eq "one hundred googol"
11
- expect(NumbersInWords.in_words(30 + 100*10**100)).to eq "one hundred googol and thirty"
8
+ expect(NumbersInWords.in_words(100)).to eq 'one hundred'
9
+ expect(NumbersInWords.in_words(-100)).to eq 'minus one hundred'
10
+ expect(NumbersInWords.in_words(24)).to eq 'twenty-four'
11
+ expect(NumbersInWords.in_words(1.2)).to eq 'one point two'
12
+ expect(NumbersInWords.in_words(100 * 10**100)).to eq 'one hundred googol'
13
+ expect(NumbersInWords.in_words(30 + 100 * 10**100)).to eq 'one hundred googol and thirty'
12
14
  end
15
+ end
16
+
17
+ FRACTION_TO_WORDS = {
18
+ [1, 2] => 'one half',
19
+ [3, 2] => 'three halves',
20
+ [1, 3] => 'one third',
21
+ [1, 4] => 'one quarter',
22
+ [1, 5] => 'one fifth',
23
+ [1, 19] => 'one nineteenth',
24
+ [2, 17] => 'two seventeenths',
25
+ [1, 21] => 'one twenty-first',
26
+ [1, 32] => 'one thirty-second',
27
+ [1, 101] => 'one one hundred and first',
28
+ [3, 101] => 'three hundred and firsts',
29
+ [73, 102] => 'seventy-three hundred and seconds',
30
+ [13, 97] => 'thirteen ninety-sevenths'
31
+ }.freeze
13
32
 
14
- pending "This should be implemented" do
15
- expect(NumbersInWords.in_words(100*10**100)).to eq "one hundred googols"
33
+ FRACTION_TO_WORDS.each do |(numerator, denominator), string|
34
+ it "#{numerator}/#{denominator} == #{string}" do
35
+ expect(NumbersInWords.in_words(numerator.to_f / denominator, fraction: true)).to eql(string)
16
36
  end
17
37
  end
18
38
 
19
- describe ".in_numbers" do
39
+ describe '.in_numbers' do
20
40
  it do
21
- expect(NumbersInWords.in_numbers("one hundred")).to eq 100
41
+ expect(NumbersInWords.in_numbers('hundred')).to eq 100
42
+ expect(NumbersInWords.in_numbers('one hundred')).to eq 100
43
+
44
+ expect(NumbersInWords.in_numbers('minus one hundred')).to eq(-100)
45
+ expect(NumbersInWords.in_numbers('twenty four')).to eq 24
46
+ expect(NumbersInWords.in_numbers('one point two')).to eq 1.2
47
+ expect(NumbersInWords.in_numbers('one hundred googol')).to eq 100 * 10**100
48
+ expect(NumbersInWords.in_numbers('one hundred googol and thirty')).to eq 30 + 100 * 10**100
22
49
  end
23
50
  end
24
-
25
-
26
51
  end
@@ -1,17 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require './spec/spec_helper'
4
+ require 'numbers_in_words/number_group'
2
5
 
3
6
  describe NumbersInWords::NumberGroup do
4
- it "should split into group of three digit numbers" do
5
- g = Numeric::NumberGroup
6
-
7
- expect(g.groups_of(1 ,3 )).to eq({0=>1 })
8
- expect(g.groups_of(12 ,3 )).to eq({0=>12 })
9
- expect(g.groups_of(123 ,3 )).to eq({0=>123 })
10
- expect(g.groups_of(1111 ,3 )).to eq({3=>1 , 0=>111 })
11
- expect(g.groups_of(87654 ,3 )).to eq({3=>87 , 0=>654 })
12
- expect(g.groups_of(1_234_567 ,3 )).to eq({6=>1 , 3=>234 , 0=>567 })
13
- expect(g.groups_of(123_456_789_101_112 ,3 )).to eq({12=>123 , 9=>456 , 6=>789 , 3=>101 , 0=>112 })
7
+ it 'should split into group of three digit numbers' do
8
+ g = described_class
9
+ expect(g.groups_of(1, 3)).to eq({ 0 => 1 })
10
+ expect(g.groups_of(12, 3)).to eq({ 0 => 12 })
11
+ expect(g.groups_of(123, 3)).to eq({ 0 => 123 })
12
+ expect(g.groups_of(1111, 3)).to eq({ 3 => 1, 0 => 111 })
13
+ expect(g.groups_of(87_654, 3)).to eq({ 3 => 87, 0 => 654 })
14
+ expect(g.groups_of(1_234_567, 3)).to eq({ 6 => 1, 3 => 234, 0 => 567 })
15
+ expect(g.groups_of(123_456_789_101_112, 3)).to eq({ 12 => 123, 9 => 456, 6 => 789, 3 => 101, 0 => 112 })
14
16
  end
15
17
  end
16
-
17
-
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './spec/spec_helper'
4
+ require 'numbers_in_words/parsing/number_parser'
5
+
6
+ describe NumbersInWords::NumberParser do
7
+ subject do
8
+ super().parse(number)
9
+ end
10
+
11
+ context 'with single digit' do
12
+ let(:number) { [9] }
13
+ it { expect(subject).to eq 9 }
14
+ end
15
+
16
+ context 'with thousands' do
17
+ let(:number) { [20, 1000] }
18
+ it { expect(subject).to eq 20_000 }
19
+ end
20
+
21
+ context 'with thousands with a leading one' do
22
+ let(:number) { [1, 1000, 6, 100] }
23
+ it { expect(subject).to eq 1600 }
24
+ end
25
+
26
+ context 'with hundreds' do
27
+ let(:number) { [2, 100, 45] }
28
+
29
+ it { expect(subject).to eq 245 }
30
+ end
31
+ end
@@ -1,106 +1,99 @@
1
- require './spec/spec_helper'
2
-
3
- describe NumbersInWords do
4
- describe ".language" do
5
- after do
6
- NumbersInWords.instance_variable_set(:"@language", nil)
7
- end
8
-
9
- it "has a default value" do
10
- expect(NumbersInWords.language).to eq "English"
11
- end
1
+ # frozen_string_literal: true
12
2
 
13
- it "can be set" do
14
- NumbersInWords.language = "some language"
15
- expect(NumbersInWords.language).to eq "some language"
16
- end
17
- end
3
+ require './spec/spec_helper'
18
4
 
19
- describe ".in_words" do
5
+ describe NumbersInWords do # rubocop: disable Metrics/BlockLength
6
+ describe '.in_words' do
20
7
  it do
21
- expect(NumbersInWords.in_words(100)).to eq "one hundred"
8
+ expect(NumbersInWords.in_words(100)).to eq 'one hundred'
22
9
  end
23
10
  end
24
11
 
25
- describe ".in_numbers" do
12
+ describe '.in_numbers' do
26
13
  it do
27
- expect(NumbersInWords.in_numbers("one hundred")).to eq 100
14
+ expect(NumbersInWords.in_numbers('one-hundred')).to eq 100
28
15
  end
29
16
  end
30
17
 
31
- it "should print the digits 0-9 correctly" do
18
+ it 'should print the digits 0-9 correctly' do
32
19
  numbers = %w[zero one two three four five six seven eight nine]
33
20
 
34
21
  10.times { |i| expect(i.in_words).to eq(numbers[i]) }
35
22
  end
36
23
 
37
- it "should print the digits 11-19 correctly" do
24
+ it 'should print the digits 11-19 correctly' do
38
25
  words = %w[eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen]
39
- numbers = [11,12,13,14,15,16,17,18,19]
26
+ numbers = [11, 12, 13, 14, 15, 16, 17, 18, 19]
40
27
  numbers.each_with_index do |number, index|
41
28
  expect(number.in_words).to eq(words[index])
42
-
43
29
  end
44
30
  end
45
31
 
46
- it "should handle two digit numbers" do
47
- expect(21.in_words). to eq("twenty one")
32
+ it 'should handle two digit numbers' do
33
+ expect(21.in_words).to eq('twenty-one')
48
34
  end
49
35
 
50
- it "should handle three digit numbers" do
51
- expect(113.in_words). to eq("one hundred and thirteen")
52
- expect(299.in_words). to eq("two hundred and ninety nine")
53
- expect(300.in_words). to eq("three hundred")
54
- expect(101.in_words). to eq("one hundred and one")
36
+ it 'should handle three digit numbers' do
37
+ expect(113.in_words).to eq('one hundred and thirteen')
38
+ expect(299.in_words).to eq('two hundred and ninety-nine')
39
+ expect(300.in_words).to eq('three hundred')
40
+ expect(101.in_words).to eq('one hundred and one')
55
41
  end
56
42
 
57
- it "should print out some random examples correctly" do
58
- expect(2999 .in_words). to eq("two thousand nine hundred and ninety nine")
59
- expect(99999 .in_words). to eq("ninety nine thousand nine hundred and ninety nine")
60
- expect(999999 .in_words). to eq("nine hundred and ninety nine thousand nine hundred and ninety nine")
61
- expect(123456 .in_words). to eq("one hundred and twenty three thousand four hundred and fifty six")
62
- expect(17054 .in_words). to eq("seventeen thousand and fifty four")
63
- expect(11004 .in_words). to eq("eleven thousand and four")
64
- expect(470154 .in_words). to eq("four hundred and seventy thousand one hundred and fifty four")
65
- expect(417155 .in_words). to eq("four hundred and seventeen thousand one hundred and fifty five")
66
- expect(999999 .in_words). to eq("nine hundred and ninety nine thousand nine hundred and ninety nine")
67
- expect(1000000 .in_words). to eq("one million")
68
- expect(1000001 .in_words). to eq("one million and one")
69
- expect(112 .in_words). to eq("one hundred and twelve")
43
+ it 'should print out some random examples correctly' do
44
+ expect(2999.in_words).to eq('two thousand nine hundred and ninety-nine')
45
+ expect(99_999.in_words).to eq('ninety-nine thousand nine hundred and ninety-nine')
46
+ expect(999_999.in_words).to eq('nine hundred and ninety-nine thousand nine hundred and ninety-nine')
47
+ expect(123_456.in_words).to eq('one hundred and twenty-three thousand four hundred and fifty-six')
48
+ expect(24_056.in_words).to eq('twenty-four thousand and fifty-six')
49
+ expect(17_054.in_words).to eq('seventeen thousand and fifty-four')
50
+ expect(11_004.in_words).to eq('eleven thousand and four')
51
+ expect(470_154.in_words).to eq('four hundred and seventy thousand one hundred and fifty-four')
52
+ expect(417_155.in_words).to eq('four hundred and seventeen thousand one hundred and fifty-five')
53
+ expect(999_999.in_words).to eq('nine hundred and ninety-nine thousand nine hundred and ninety-nine')
54
+ expect(1_000_000.in_words).to eq('one million')
55
+ expect(1_000_001.in_words).to eq('one million and one')
56
+ expect(112.in_words).to eq('one hundred and twelve')
70
57
  end
71
58
 
72
- it "should handle edge cases" do
73
- expect(1000001 .in_words). to eq("one million and one")
74
- expect((10*10**12 + 10**6 +1) .in_words). to eq("ten trillion one million and one")
75
- expect((10**75) .in_words). to eq("one quattuorvigintillion")
76
- expect(10001001 .in_words). to eq("ten million one thousand and one")
59
+ it 'should handle edge cases' do
60
+ expect(1_000_001.in_words).to eq('one million and one')
61
+ expect((10 * 10**12 + 10**6 + 1).in_words).to eq('ten trillion one million and one')
62
+ expect((10**75).in_words).to eq('one quattuorvigintillion')
63
+ expect(10_001_001.in_words).to eq('ten million one thousand and one')
77
64
  end
78
65
 
79
- it "should handle a googol and larger" do
80
- n=10**100
81
- expect((10**100 + 1) .in_words). to eq("one googol and one")
82
- expect((42*10**100 + 16777216).in_words). to eq("forty two googol sixteen million seven hundred and seventy seven thousand two hundred and sixteen")
83
- expect((42* 10**100 * 10**100).in_words). to eq("forty two googol googol")
66
+ it 'should handle a googol and larger' do
67
+ googol = 10**100
68
+ expect((googol + 1).in_words).to eq('one googol and one')
69
+ expect((42 * googol + 16_777_216).in_words)
70
+ .to eq('forty-two googol sixteen million seven hundred and seventy-seven thousand two hundred and sixteen')
71
+ expect((42 * googol * googol).in_words).to eq('forty-two googol googol')
84
72
  end
85
73
 
86
- it "should handle negative numbers" do
87
- expect(-1 .in_words).to eq("minus one")
88
- expect(-9 .in_words).to eq("minus nine")
89
- expect(-10 .in_words).to eq("minus ten")
90
- expect(-15 .in_words).to eq("minus fifteen")
91
- expect(-100 .in_words).to eq("minus one hundred")
92
- expect((-1*(10**100)).in_words).to eq("minus one googol")
93
- expect(-123456789 .in_words).to eq("minus one hundred and twenty three million four hundred and fifty six thousand seven hundred and eighty nine")
74
+ it 'should handle negative numbers' do
75
+ expect(-1.in_words).to eq('minus one')
76
+ expect(-9.in_words).to eq('minus nine')
77
+ expect(-10.in_words).to eq('minus ten')
78
+ expect(-15.in_words).to eq('minus fifteen')
79
+ expect(-100.in_words).to eq('minus one hundred')
80
+ expect((-1 * (10**100)).in_words).to eq('minus one googol')
81
+
82
+ expect(-123_456_789.in_words)
83
+ .to eq('minus one hundred and twenty-three million four hundred and ' \
84
+ 'fifty-six thousand seven hundred and eighty-nine')
94
85
  end
95
86
 
96
- it "should handle decimals" do
97
- #because of lack of absolute accuracy with floats
98
- #the output won't be exactly as you might expect
99
- #so we will match rather than find equivalents
100
- expect(1.1 .in_words).to match(/one point one/)
101
- expect(1.2345678 .in_words).to match(/one point two three four five six seven eight/)
102
- expect(1000.2345678 .in_words).to match(/one thousand point two three four five six seven eight/)
103
- expect(12345.2345678.in_words).to match(/twelve thousand three hundred and forty five point two three four five six seven eight/)
87
+ it 'should handle decimals' do
88
+ # because of lack of absolute accuracy with floats
89
+ # the output won't be exactly as you might expect
90
+ # so we will match rather than find equivalents
91
+ expect(1.1.in_words).to match(/one point one/)
92
+ expect(1.2345678.in_words).to match(/one point two three four five six seven eight/)
93
+ expect(1000.2345678.in_words).to match(/one thousand point two three four five six seven eight/)
94
+ expect(12_345.2345678.in_words)
95
+ .to match(/twelve thousand three hundred and forty-five point two three four five six seven eight/)
96
+
104
97
  expect((10**9 + 0.1).in_words).to match(/one billion point one/)
105
98
  end
106
99
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './spec/spec_helper'
4
+
5
+ describe NumbersInWords do
6
+ it 'recognizes numerical strings' do
7
+ arr = %w[8 56 100 5789 3435356]
8
+ arr.each { |s| expect(s.in_numbers).to eql(s.to_f) }
9
+ end
10
+
11
+ MIXED = {
12
+ '19 hundred' => 1_900,
13
+ '20 thousand' => 20_000,
14
+ '100 million' => 100_000_000,
15
+ '7 billion' => 7_000_000_000,
16
+ '42 trillion' => 42_000_000_000_000,
17
+ '20 thousand and 4' => 20_004
18
+ }.freeze
19
+
20
+ MIXED.each do |k, v|
21
+ it do
22
+ expect(k.in_numbers).to eql(v)
23
+ end
24
+ end
25
+
26
+ PENDING_MIXED = {
27
+ '19 zero five' => 1_905
28
+ }.freeze
29
+
30
+ PENDING_MIXED.each do |k, v|
31
+ pending do
32
+ expect(k.in_numbers).to eql(v)
33
+ end
34
+ end
35
+ end
@@ -1,6 +1,26 @@
1
- require 'numbers_in_words'
2
- require 'numbers_in_words/duck_punch'
1
+ # frozen_string_literal: true
2
+
3
+ if ENV['CC_TEST_REPORTER_ID']
4
+ require 'simplecov'
5
+ SimpleCov.start
6
+ end
3
7
 
4
- require "codeclimate-test-reporter"
5
- CodeClimate::TestReporter.start
8
+ unless Kernel.method_defined?(:silence_warnings)
9
+ module Kernel
10
+ def silence_warnings
11
+ with_warnings(nil) { yield }
12
+ end
6
13
 
14
+ def with_warnings(flag)
15
+ old_verbose = $VERBOSE
16
+ $VERBOSE = flag
17
+ yield
18
+ ensure
19
+ $VERBOSE = old_verbose
20
+ end
21
+ end
22
+ end
23
+
24
+ require 'numbers_in_words'
25
+ require 'numbers_in_words/duck_punch'
26
+ require 'byebug'
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe NumbersInWords::ToWord do
4
+ let(:number) { 2_111 }
5
+ let(:writer) { described_class.new(number) }
6
+
7
+ describe '#in_words' do
8
+ let(:number) { 99 }
9
+
10
+ subject do
11
+ writer.in_words
12
+ end
13
+
14
+ it do
15
+ expect(subject).to eq 'ninety-nine'
16
+ end
17
+ end
18
+ end
@@ -1,135 +1,152 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require './spec/spec_helper'
2
4
 
3
- describe WordsInNumbers do
4
- it "should do the digits 0-10" do
5
- expect("zero" .in_numbers).to eq(0)
6
- expect("one" .in_numbers).to eq(1)
7
- expect("two" .in_numbers).to eq(2)
8
- expect("three" .in_numbers).to eq(3)
9
- expect("four" .in_numbers).to eq(4)
10
- expect("five" .in_numbers).to eq(5)
11
- expect("six" .in_numbers).to eq(6)
12
- expect("seven" .in_numbers).to eq(7)
13
- expect("eight" .in_numbers).to eq(8)
14
- expect("nine" .in_numbers).to eq(9)
5
+ describe NumbersInWords::StringExtension do # rubocop: disable Metrics/BlockLength
6
+ it 'should do the digits 0-10' do
7
+ expect('zero'.in_numbers).to eq(0)
8
+ expect('one'.in_numbers).to eq(1)
9
+ expect('two'.in_numbers).to eq(2)
10
+ expect('three'.in_numbers).to eq(3)
11
+ expect('four'.in_numbers).to eq(4)
12
+ expect('five'.in_numbers).to eq(5)
13
+ expect('six'.in_numbers).to eq(6)
14
+ expect('seven'.in_numbers).to eq(7)
15
+ expect('eight'.in_numbers).to eq(8)
16
+ expect('nine'.in_numbers).to eq(9)
17
+ end
18
+
19
+ it 'should handle numbers for which there is one word' do
20
+ expect('ten'.in_numbers).to eq(10)
21
+ expect('eleven'.in_numbers).to eq(11)
22
+ expect('twelve'.in_numbers).to eq(12)
23
+ expect('thirteen'.in_numbers).to eq(13)
24
+ expect('fourteen'.in_numbers).to eq(14)
25
+ expect('fifteen'.in_numbers).to eq(15)
26
+ expect('sixteen'.in_numbers).to eq(16)
27
+ expect('seventeen'.in_numbers).to eq(17)
28
+ expect('eighteen'.in_numbers).to eq(18)
29
+ expect('nineteen'.in_numbers).to eq(19)
30
+ expect('twenty'.in_numbers).to eq(20)
31
+ end
32
+
33
+ it 'should handle two word numbers up to 100' do
34
+ expect('twenty-one'.in_numbers).to eq(21)
35
+ expect('twenty-two'.in_numbers).to eq(22)
36
+ expect('twenty-three'.in_numbers).to eq(23)
37
+ expect('twenty-four'.in_numbers).to eq(24)
38
+ expect('twenty-five'.in_numbers).to eq(25)
39
+ expect('twenty-six'.in_numbers).to eq(26)
40
+ expect('twenty-seven'.in_numbers).to eq(27)
41
+ expect('twenty-eight'.in_numbers).to eq(28)
42
+ expect('seventy-six'.in_numbers).to eq(76)
43
+ expect('ninety-nine'.in_numbers).to eq(99)
15
44
  end
16
45
 
17
- it "should handle numbers for which there is one word" do
18
- expect("ten" .in_numbers).to eq(10)
19
- expect("eleven" .in_numbers).to eq(11)
20
- expect("twelve" .in_numbers).to eq(12)
21
- expect("thirteen" .in_numbers).to eq(13)
22
- expect("fourteen" .in_numbers).to eq(14)
23
- expect("fifteen" .in_numbers).to eq(15)
24
- expect("sixteen" .in_numbers).to eq(16)
25
- expect("seventeen" .in_numbers).to eq(17)
26
- expect("eighteen" .in_numbers).to eq(18)
27
- expect("nineteen" .in_numbers).to eq(19)
28
- expect("twenty" .in_numbers).to eq(20)
46
+ it 'should handle hundreds' do
47
+ expect('one hundred'.in_numbers).to eq(100)
48
+ expect('two hundred'.in_numbers).to eq(200)
49
+ expect('three hundred'.in_numbers).to eq(300)
50
+ expect('nine hundred'.in_numbers).to eq(900)
51
+ expect('one hundred and seventy six'.in_numbers).to eq(176)
52
+ expect('one hundred and seventy nine'.in_numbers).to eq(179)
53
+ expect('nine hundred and ninety nine'.in_numbers).to eq(999)
29
54
  end
30
55
 
31
- it "should handle two word numbers up to 100" do
32
- expect("twenty one" .in_numbers).to eq(21)
33
- expect("twenty two" .in_numbers).to eq(22)
34
- expect("twenty three" .in_numbers).to eq(23)
35
- expect("twenty four" .in_numbers).to eq(24)
36
- expect("twenty five" .in_numbers).to eq(25)
37
- expect("twenty six" .in_numbers).to eq(26)
38
- expect("twenty seven" .in_numbers).to eq(27)
39
- expect("twenty eight" .in_numbers).to eq(28)
40
- expect("seventy six" .in_numbers).to eq(76)
41
- expect("ninety nine" .in_numbers).to eq(99)
56
+ it 'should handle unusual hundreds' do
57
+ expect('eleven hundred'.in_numbers).to eq(1100)
58
+ expect('twelve hundred'.in_numbers).to eq(1200)
59
+ expect('thirteen hundred'.in_numbers).to eq(1300)
60
+ expect('fifteen hundred'.in_numbers).to eq(1500)
61
+ expect('nineteen hundred'.in_numbers).to eq(1900)
62
+ end
63
+ it 'should handle thousands' do
64
+ expect('two thousand and one'.in_numbers).to eq(2001)
65
+ expect('one thousand'.in_numbers).to eq(1000)
66
+ expect('two thousand'.in_numbers).to eq(2000)
67
+ expect('three thousand'.in_numbers).to eq(3000)
68
+ expect('nine thousand'.in_numbers).to eq(9000)
69
+ expect('nine thousand two hundred'.in_numbers).to eq(9200)
70
+ expect('nine thousand two hundred and seven'.in_numbers).to eq(9207)
71
+ expect('nine thousand two hundred and ninety seven'.in_numbers).to eq(9297)
42
72
  end
43
73
 
44
- it "should handle hundreds" do
45
- expect("one hundred" .in_numbers).to eq(100)
46
- expect("two hundred" .in_numbers).to eq(200)
47
- expect("three hundred" .in_numbers).to eq(300)
48
- expect("nine hundred" .in_numbers).to eq(900)
49
- expect("one hundred and seventy six" .in_numbers).to eq(176)
50
- expect("one hundred and seventy nine" .in_numbers).to eq(179)
51
- expect("nine hundred and ninety nine" .in_numbers).to eq(999)
74
+ it 'handles numbers that begin with a instead of one', :aggregate_failures do
75
+ expect('a thousand six hundred'.in_numbers).to eq(1600)
76
+ expect('a thousand six hundred and fifty-five'.in_numbers).to eq(1655)
52
77
  end
53
78
 
54
- it "should handle unusual hundreds" do
55
- expect("eleven hundred" .in_numbers).to eq(1100)
56
- expect("twelve hundred" .in_numbers).to eq(1200)
57
- expect("thirteen hundred" .in_numbers).to eq(1300)
58
- expect("fifteen hundred" .in_numbers).to eq(1500)
59
- expect("nineteen hundred" .in_numbers).to eq(1900)
79
+ it 'should handle larger numbers' do
80
+ expect('one million'.in_numbers).to eq(1_000_000)
81
+ expect('two googol five billion and seventy six'.in_numbers).to eq(2 * 10**100 + 5 * 10**9 + 76)
82
+ expect('thirty seven million'.in_numbers).to eq(37 * 10**6)
83
+ expect('twenty six googol'.in_numbers).to eq(26 * 10**100)
84
+ end
60
85
 
86
+ it 'should handle numbers in hundreds of thousands etc' do
87
+ expect('nine hundred thousand'.in_numbers).to eq(900_000)
88
+ expect('three hundred and fifty seven thousand'.in_numbers).to eq(357_000)
89
+ expect('five million three hundred and fifty seven thousand'.in_numbers).to eq(5_357_000)
90
+ expect('nine hundred and ninety nine trillion'.in_numbers).to eq(999 * 10**12)
91
+ end
92
+ it 'should handle negative numbers' do
93
+ expect('minus one'.in_numbers).to eq(-1)
94
+ expect('minus two googol'.in_numbers).to eq(-2 * 10**100)
95
+ expect('minus nine hundred and ninety nine trillion'.in_numbers).to eq(-999 * 10**12)
61
96
  end
62
- it "should handle thousands" do
63
- expect("two thousand and one" .in_numbers) .to eq(2001)
64
- expect("one thousand" .in_numbers) .to eq(1000)
65
- expect("two thousand" .in_numbers) .to eq(2000)
66
- expect("three thousand" .in_numbers) .to eq(3000)
67
- expect("nine thousand" .in_numbers) .to eq(9000)
68
- expect("nine thousand two hundred" .in_numbers) .to eq(9200)
69
- expect("nine thousand two hundred and seven" .in_numbers) .to eq(9207)
70
- expect("nine thousand two hundred and ninety seven" .in_numbers) .to eq(9297)
71
- end
72
-
73
- it "should handle larger numbers" do
74
- expect("one million" .in_numbers) .to eq(1000000)
75
- expect("two googol five billion and seventy six" .in_numbers) .to eq(2*10**100 + 5*10**9 + 76)
76
- expect("thirty seven million" .in_numbers) .to eq(37 * 10**6)
77
- expect("twenty six googol" .in_numbers) .to eq(26 * 10**100)
78
- end
79
-
80
- it "should handle numbers in hundreds of thousands etc" do
81
- expect("nine hundred thousand" .in_numbers) .to eq(900000)
82
- expect("three hundred and fifty seven thousand" .in_numbers) .to eq(357000)
83
- expect("five million three hundred and fifty seven thousand" .in_numbers) .to eq(5357000)
84
- expect("nine hundred and ninety nine trillion" .in_numbers) .to eq(999 * 10**12)
85
- end
86
- it "should handle negative numbers" do
87
- expect("minus one" .in_numbers) .to eq(-1)
88
- expect("minus two googol" .in_numbers) .to eq(-2 * 10**100)
89
- expect("minus nine hundred and ninety nine trillion" .in_numbers) .to eq(-999 * 10**12)
90
- end
91
-
92
- it "should ignore punctuation and capitalisation" do
93
- expect("Minus one" .in_numbers) .to eq(-1)
94
- expect("FIVE Million, three hundred and fifty-seVen Thousand" .in_numbers) .to eq(5357000)
95
- expect("FIVE,,./';';';[] Million, three hundred and fifty-seVen Thousand" .in_numbers) .to eq(5357000)
96
-
97
- end
98
-
99
- it "should handle decimal points" do
100
- expect("one point one" .in_numbers) .to eq(1.1)
101
-
102
- expect("zero point seven six five three four" .in_numbers) .to eq(0.76534)
103
- expect("one trillion point six" .in_numbers) .to eq(10**12 + 0.6)
104
-
105
- long_number = <<-NUMBER
106
- nine duotrigintillion seven hundred and seventy seven untrigintillion
107
- fifty nine trigintillion one hundred and sixty novemvigintillion
108
- eight hundred and six octovigintillion seven hundred and thirty six
109
- septenvigintillion four hundred and seventy one sexvigintillion
110
- nine hundred and seventy quinvigintillion six hundred and thirty two
111
- quattuorvigintillion eight hundred and twenty seven trevigintillion
112
- eight hundred and thirty six duovigintillion nine hundred and fifty
113
- two unvigintillion seven hundred and ten vigintillion eight hundred and one
114
- novemdecillion nine hundred and forty eight octodecillion seven hundred
115
- and five septendecillion six hundred and eighty three sexdecillion
116
- one hundred and six quindecillion seven hundred and seven quattuordecillion
117
- seven hundred and fifty seven tredecillion four hundred and twenty six
118
- duodecillion seven hundred and ninety five undecillion seven hundred
119
- and forty six decillion eight hundred and thirteen nonillion one hundred
120
- and twenty seven octillion four hundred and sixty five septillion two
121
- hundred and thirty seven sextillion one hundred and thirty nine
122
- quintillion one hundred and fifty three quadrillion forty six
123
- trillion seven hundred and fifty two billion eight hundred and three
124
- million ninety three thousand seven hundred and ninety one point
125
- eight nine five six four three two one eight nine five six seven eight
97
+
98
+ it 'should ignore punctuation and capitalisation' do
99
+ expect('Minus one'.in_numbers).to eq(-1)
100
+ expect('FIVE Million, three hundred and fifty-seVen Thousand'.in_numbers).to eq(5_357_000)
101
+ expect("FIVE,,./';';';[] Million, three hundred and fifty-seVen Thousand".in_numbers).to eq(5_357_000)
102
+ end
103
+
104
+ it 'should handle decimal points' do # rubocop: disable Metrics/BlockLength
105
+ expect('one point one'.in_numbers).to eq(1.1)
106
+
107
+ expect('zero point seven six five three four'.in_numbers).to eq(0.76534)
108
+ expect('one trillion point six'.in_numbers).to eq(10**12 + 0.6)
109
+
110
+ long_number = <<~NUMBER
111
+ nine duotrigintillion seven hundred and seventy seven untrigintillion
112
+ fifty nine trigintillion one hundred and sixty novemvigintillion
113
+ eight hundred and six octovigintillion seven hundred and thirty six
114
+ septenvigintillion four hundred and seventy one sexvigintillion
115
+ nine hundred and seventy quinvigintillion six hundred and thirty two
116
+ quattuorvigintillion eight hundred and twenty seven trevigintillion
117
+ eight hundred and thirty six duovigintillion nine hundred and fifty
118
+ two unvigintillion seven hundred and ten vigintillion eight hundred and one
119
+ novemdecillion nine hundred and forty eight octodecillion seven hundred
120
+ and five septendecillion six hundred and eighty three sexdecillion
121
+ one hundred and six quindecillion seven hundred and seven quattuordecillion
122
+ seven hundred and fifty seven tredecillion four hundred and twenty six
123
+ duodecillion seven hundred and ninety five undecillion seven hundred
124
+ and forty six decillion eight hundred and thirteen nonillion one hundred
125
+ and twenty seven octillion four hundred and sixty five septillion two
126
+ hundred and thirty seven sextillion one hundred and thirty nine
127
+ quintillion one hundred and fifty three quadrillion forty six
128
+ trillion seven hundred and fifty two billion eight hundred and three
129
+ million ninety three thousand seven hundred and ninety one point
130
+ eight nine five six four three two one eight nine five six seven eight
126
131
  NUMBER
132
+
133
+ # rubocop: disable Metrics/LineLength
127
134
  expect(long_number.in_numbers).to eq(
128
- 9777059160806736471970632827836952710801948705683106707757426795746813127465237139153046752803093791.89564321895678
135
+ 9_777_059_160_806_736_471_970_632_827_836_952_710_801_948_705_683_106_707_757_426_795_746_813_127_465_237_139_153_046_752_803_093_791.89564321895678
129
136
  )
137
+ # rubocop: enable Metrics/LineLength
130
138
 
131
- expect("seventy five point eight four three two seven six nine four five one eight".
132
- in_numbers).to eq(75.84327694518)
139
+ expect('seventy five point eight four three two seven six nine four five one eight'
140
+ .in_numbers).to eq(75.84327694518)
133
141
  end
134
142
 
143
+ it 'should handle years notation' do
144
+ expect('fifteen sixteen'.in_numbers).to eq(1516)
145
+ expect('eighty five sixteen'.in_numbers).to eq(8516)
146
+ expect('nineteen ninety six'.in_numbers).to eq(1996)
147
+ expect('forty nine ninety eight forty seven seventy nine'.in_numbers).to eq(49_984_779)
148
+ expect('fifteen sixteen'.in_numbers).to eq(1516)
149
+ expect('fifteen sixteen seven'.in_numbers).to eq(15_167)
150
+ expect('fifteen sixteen seventeen'.in_numbers).to eq(151_617)
151
+ end
135
152
  end