human_numbers 0.0.4 → 0.1.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: 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: []