human_numbers 0.0.4 → 0.1.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: 2c27203e87af4959fab86a60ebe89f77f2f8c44d
4
- data.tar.gz: 870df52ff4bf50da56ba750c9a9473074474e966
3
+ metadata.gz: 51879c78691b24478ed71ee9bd575ef199a0e6de
4
+ data.tar.gz: e62d835ba04175b547c8c1fc6f6a59ba829357ac
5
5
  SHA512:
6
- metadata.gz: 66d8ed47bdabf5f534893140eef1b60e5ea155abf75eff96bb5ddaf0fbed885a3cfc37db0e3fc2325f170cffd383fe73ca33001e1c616f76df0d6f9abc368a30
7
- data.tar.gz: 314579ebbe2f2f8708ae7f493c339b34eac34f837dc83ef7ef8a2cba3debafd4984d0c526dac955f92d539deda4ee71b164614b7825757ad2cdd6314dacc2f62
6
+ metadata.gz: d29db2bd8b55c18c3cf21533c137feb286d6ace111d0a452949557caaa4e82bb8e141cd83b1563e8c8b6fd4afc11f84848024cdeae8ef2d0131e10489b7c9a52
7
+ data.tar.gz: 678e077627851c8478df921b63791345c835c9c803cc4f09ce134f94c831d4b17f4ac462a9174bdd61909d183c943cb075995f12bc405bdf1fb5381ea7ca6a37
@@ -1,4 +1,6 @@
1
1
  module HumanNumbers
2
+ UPPER_BOUND = 10 ** 33
2
3
  end
3
4
 
4
5
  require 'human_numbers/english'
6
+ require 'human_numbers/french'
@@ -5,32 +5,33 @@ module HumanNumbers::English
5
5
 
6
6
  def self.cardinal_number(n, prefix='')
7
7
  return prefix.empty? ? 'zero' : '' if n.zero?
8
- if n >= 1_000_000_000_000_000_000_000_000_000_000_000
8
+ if n >= HumanNumbers::UPPER_BOUND
9
9
  raise ArgumentError, "number too large to print in English: #{n}"
10
10
  end
11
11
 
12
- prefix + if n >= 1_000_000_000_000_000_000_000_000_000_000
13
- cardinal_factor(n, 'nonillion', 1_000_000_000_000_000_000_000_000_000_000)
14
- elsif n >= 1_000_000_000_000_000_000_000_000_000
15
- cardinal_factor(n, 'octillion', 1_000_000_000_000_000_000_000_000_000)
16
- elsif n >= 1_000_000_000_000_000_000_000_000
17
- cardinal_factor(n, 'septillion', 1_000_000_000_000_000_000_000_000)
18
- elsif n >= 1_000_000_000_000_000_000_000
19
- cardinal_factor(n, 'sextillion', 1_000_000_000_000_000_000_000)
20
- elsif n >= 1_000_000_000_000_000_000
21
- cardinal_factor(n, 'quintillion', 1_000_000_000_000_000_000)
22
- elsif n >= 1_000_000_000_000_000
23
- cardinal_factor(n, 'quadrillion', 1_000_000_000_000_000)
24
- elsif n >= 1_000_000_000_000
25
- cardinal_factor(n, 'trillion', 1_000_000_000_000)
26
- elsif n >= 1_000_000_000
27
- cardinal_factor(n, 'billion', 1_000_000_000)
28
- elsif n >= 1_000_000
29
- cardinal_factor(n, 'million', 1_000_000)
30
- elsif n >= 1000
31
- cardinal_factor(n, 'thousand', 1000)
32
- elsif n >= 100
33
- cardinal_factor(n, 'hundred', 100)
12
+ prefix +
13
+ if n >= 10 ** 30
14
+ cardinal_factor(n, 'nonillion', 10 ** 30)
15
+ elsif n >= 10 ** 27
16
+ cardinal_factor(n, 'octillion', 10 ** 27)
17
+ elsif n >= 10 ** 24
18
+ cardinal_factor(n, 'septillion', 10 ** 24)
19
+ elsif n >= 10 ** 21
20
+ cardinal_factor(n, 'sextillion', 10 ** 21)
21
+ elsif n >= 10 ** 18
22
+ cardinal_factor(n, 'quintillion', 10 ** 18)
23
+ elsif n >= 10 ** 15
24
+ cardinal_factor(n, 'quadrillion', 10 ** 15)
25
+ elsif n >= 10 ** 12
26
+ cardinal_factor(n, 'trillion', 10 ** 12)
27
+ elsif n >= 10 ** 9
28
+ cardinal_factor(n, 'billion', 10 ** 9)
29
+ elsif n >= 10 ** 6
30
+ cardinal_factor(n, 'million', 10 ** 6)
31
+ elsif n >= 10 ** 3
32
+ cardinal_factor(n, 'thousand', 10 ** 3)
33
+ elsif n >= 10 ** 2
34
+ cardinal_factor(n, 'hundred', 10 ** 2)
34
35
  elsif n >= 20
35
36
  simple_cardinal(n / 10 * 10) + simple_cardinal(n % 10, '-')
36
37
  else
@@ -40,35 +41,36 @@ module HumanNumbers::English
40
41
 
41
42
  def self.simple_cardinal(n, prefix='')
42
43
  return '' if n.zero?
43
- prefix + case n
44
- when 1; 'one'
45
- when 2; 'two'
46
- when 3; 'three'
47
- when 4; 'four'
48
- when 5; 'five'
49
- when 6; 'six'
50
- when 7; 'seven'
51
- when 8; 'eight'
52
- when 9; 'nine'
53
- when 10; 'ten'
54
- when 11; 'eleven'
55
- when 12; 'twelve'
56
- when 13; 'thirteen'
57
- when 14; 'fourteen'
58
- when 15; 'fifteen'
59
- when 16; 'sixteen'
60
- when 17; 'seventeen'
61
- when 18; 'eighteen'
62
- when 19; 'nineteen'
63
- when 20; 'twenty'
64
- when 30; 'thirty'
65
- when 40; 'forty'
66
- when 50; 'fifty'
67
- when 60; 'sixty'
68
- when 70; 'seventy'
69
- when 80; 'eighty'
70
- when 90; 'ninety'
71
- end
44
+ prefix +
45
+ case n
46
+ when 1; 'one'
47
+ when 2; 'two'
48
+ when 3; 'three'
49
+ when 4; 'four'
50
+ when 5; 'five'
51
+ when 6; 'six'
52
+ when 7; 'seven'
53
+ when 8; 'eight'
54
+ when 9; 'nine'
55
+ when 10; 'ten'
56
+ when 11; 'eleven'
57
+ when 12; 'twelve'
58
+ when 13; 'thirteen'
59
+ when 14; 'fourteen'
60
+ when 15; 'fifteen'
61
+ when 16; 'sixteen'
62
+ when 17; 'seventeen'
63
+ when 18; 'eighteen'
64
+ when 19; 'nineteen'
65
+ when 20; 'twenty'
66
+ when 30; 'thirty'
67
+ when 40; 'forty'
68
+ when 50; 'fifty'
69
+ when 60; 'sixty'
70
+ when 70; 'seventy'
71
+ when 80; 'eighty'
72
+ when 90; 'ninety'
73
+ end
72
74
  end
73
75
 
74
76
  def self.ordinal_number(n)
@@ -0,0 +1,118 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module HumanNumbers::French
4
+ def self.cardinal_factor(n, name, factor, gender)
5
+ factored = n / factor
6
+ mod = n % factor
7
+ name += 's' if factor > 1000 and factored > 1
8
+ cardinal_number(factored) + "-#{name}" + cardinal_number(mod, gender, '-')
9
+ end
10
+
11
+ def self.cardinal_number(n, gender=:masculine, prefix='')
12
+ return prefix.empty? ? 'zéro' : '' if n.zero?
13
+ if n >= HumanNumbers::UPPER_BOUND
14
+ raise ArgumentError, "number too large to print in French: #{n}"
15
+ end
16
+
17
+ prefix +
18
+ if n >= 10 ** 30
19
+ cardinal_factor(n, 'quintillion', 10 ** 30, gender)
20
+ elsif n >= 10 ** 27
21
+ cardinal_factor(n, 'quadrilliard', 10 ** 27, gender)
22
+ elsif n >= 10 ** 24
23
+ cardinal_factor(n, 'quadrillion', 10 ** 24, gender)
24
+ elsif n >= 10 ** 21
25
+ cardinal_factor(n, 'trilliard', 10 ** 21, gender)
26
+ elsif n >= 10 ** 18
27
+ cardinal_factor(n, 'trillion', 10 ** 18, gender)
28
+ elsif n >= 10 ** 15
29
+ cardinal_factor(n, 'billiard', 10 ** 15, gender)
30
+ elsif n >= 10 ** 12
31
+ cardinal_factor(n, 'billion', 10 ** 12, gender)
32
+ elsif n >= 10 ** 9
33
+ cardinal_factor(n, 'milliard', 10 ** 9, gender)
34
+ elsif n >= 10 ** 6
35
+ cardinal_factor(n, 'million', 10 ** 6, gender)
36
+ elsif n >= 2000
37
+ cardinal_factor(n, 'mille', 10 ** 3, gender)
38
+ elsif n >= 1000
39
+ 'mille' + simple_cardinal(n % 1000, gender, '-')
40
+ elsif n > 100 and n % 100 == 0
41
+ cardinal_number(n / 100) + '-cents'
42
+ elsif n >= 200
43
+ cardinal_factor(n, 'cent', 100, gender)
44
+ elsif n >= 100
45
+ 'cent' + simple_cardinal(n % 100, gender, '-')
46
+ elsif n > 80
47
+ 'quatre-vingt' + simple_cardinal(n - 80, gender, '-')
48
+ elsif n == 80
49
+ 'quatre-vingts'
50
+ elsif n == 71
51
+ 'soixante-et-onze'
52
+ elsif n > 60
53
+ 'soixante' + simple_cardinal(n - 60, gender, '-')
54
+ elsif n > 20
55
+ mod = n % 10
56
+ simple_cardinal(n / 10 * 10) +
57
+ simple_cardinal(mod, gender, mod == 1 ? '-et-' : '-')
58
+ else
59
+ simple_cardinal(n, gender)
60
+ end
61
+ end
62
+
63
+ def self.simple_cardinal(n, gender=:masculine, prefix='')
64
+ return '' if n.zero?
65
+
66
+ prefix +
67
+ case n
68
+ when 1; gender == :masculine ? 'un' : 'une'
69
+ when 2; 'deux'
70
+ when 3; 'trois'
71
+ when 4; 'quatre'
72
+ when 5; 'cinq'
73
+ when 6; 'six'
74
+ when 7; 'sept'
75
+ when 8; 'huit'
76
+ when 9; 'neuf'
77
+ when 10; 'dix'
78
+ when 11; 'onze'
79
+ when 12; 'douze'
80
+ when 13; 'treize'
81
+ when 14; 'quatorze'
82
+ when 15; 'quinze'
83
+ when 16; 'seize'
84
+ when 17; 'dix-sept'
85
+ when 18; 'dix-huit'
86
+ when 19; 'dix-neuf'
87
+ when 20; 'vingt'
88
+ when 30; 'trente'
89
+ when 40; 'quarante'
90
+ when 50; 'cinquante'
91
+ when 60; 'soixante'
92
+ end
93
+ end
94
+
95
+ def self.ordinal_number(n, gender)
96
+ case n
97
+ when 1; gender == :masculine ? 'premier' : 'première'
98
+ when 5; 'cinquième'
99
+ else
100
+ cardinal_number(n, gender).sub(/f$/, 'v').sub(/e?$/, 'ième')
101
+ end
102
+ end
103
+ end
104
+
105
+ class Integer
106
+ def to_french(style = :cardinal, gender = :masculine)
107
+ unless [:masculine, :feminine].include? gender
108
+ raise ArgumentError, "unrecognized gender: #{gender}"
109
+ end
110
+
111
+ (self < 0 ? 'moins ' : '') +
112
+ case style
113
+ when :ordinal; HumanNumbers::French::ordinal_number(self.abs, gender)
114
+ when :cardinal; HumanNumbers::French::cardinal_number(self.abs, gender)
115
+ else raise ArgumentError, "unrecognized number style: #{style}"
116
+ end
117
+ end
118
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: human_numbers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle Brown
@@ -45,11 +45,14 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: 1.1.11
47
47
  description: |
48
- human_numbers defines the methods Float#to_english and Integer#to_english for
49
- converting numbers to English strings. By default, a cardinal number will be
50
- returned (one, two, three), but supplying an :ordinal argument will return an
51
- ordinal (first, second, third). Handles numbers with absolute value less than
52
- 1000000000000000000000000000000000.
48
+ human_numbers defines the method #to_english on the classes Float and
49
+ Integer, as well as the method #to_french on the Integer class, for
50
+ converting numbers to natural language strings. By default, a cardinal
51
+ number will be returned (one, two, three), but supplying an :ordinal
52
+ argument will cause it to return an ordinal (first, second, third). It
53
+ works with numbers whose absolute value is less than 10^33. #to_french
54
+ supports a second argument for specifying the gender of the word,
55
+ which can be either :masculine or :feminine.
53
56
  email: picokyle@gmail.com
54
57
  executables: []
55
58
  extensions: []
@@ -57,6 +60,7 @@ extra_rdoc_files: []
57
60
  files:
58
61
  - lib/human_numbers.rb
59
62
  - lib/human_numbers/english.rb
63
+ - lib/human_numbers/french.rb
60
64
  homepage: https://github.com/kybp/human_numbers
61
65
  licenses:
62
66
  - MIT
@@ -80,5 +84,5 @@ rubyforge_project:
80
84
  rubygems_version: 2.5.1
81
85
  signing_key:
82
86
  specification_version: 4
83
- summary: Print numbers in English
87
+ summary: Print numbers in English and French
84
88
  test_files: []