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 +4 -4
- data/lib/human_numbers.rb +2 -0
- data/lib/human_numbers/english.rb +54 -52
- data/lib/human_numbers/french.rb +118 -0
- metadata +11 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51879c78691b24478ed71ee9bd575ef199a0e6de
|
4
|
+
data.tar.gz: e62d835ba04175b547c8c1fc6f6a59ba829357ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d29db2bd8b55c18c3cf21533c137feb286d6ace111d0a452949557caaa4e82bb8e141cd83b1563e8c8b6fd4afc11f84848024cdeae8ef2d0131e10489b7c9a52
|
7
|
+
data.tar.gz: 678e077627851c8478df921b63791345c835c9c803cc4f09ce134f94c831d4b17f4ac462a9174bdd61909d183c943cb075995f12bc405bdf1fb5381ea7ca6a37
|
data/lib/human_numbers.rb
CHANGED
@@ -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 >=
|
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 +
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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 +
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
+
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
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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: []
|