module HumanNumbers::French
Public Class Methods
cardinal_factor(n, name, factor, gender)
click to toggle source
# File lib/human_numbers/french.rb, line 3 def self.cardinal_factor(n, name, factor, gender) factored = n / factor mod = n % factor name += 's' if factor > 1000 and factored > 1 cardinal_number(factored) + "-#{name}" + cardinal_number(mod, gender, '-') end
cardinal_number(n, gender=:masculine, prefix='')
click to toggle source
# File lib/human_numbers/french.rb, line 10 def self.cardinal_number(n, gender=:masculine, prefix='') return prefix.empty? ? 'zéro' : '' if n.zero? if n >= HumanNumbers::UPPER_BOUND raise ArgumentError, "number too large to print in French: #{n}" end prefix + if n >= 10 ** 30 cardinal_factor(n, 'quintillion', 10 ** 30, gender) elsif n >= 10 ** 27 cardinal_factor(n, 'quadrilliard', 10 ** 27, gender) elsif n >= 10 ** 24 cardinal_factor(n, 'quadrillion', 10 ** 24, gender) elsif n >= 10 ** 21 cardinal_factor(n, 'trilliard', 10 ** 21, gender) elsif n >= 10 ** 18 cardinal_factor(n, 'trillion', 10 ** 18, gender) elsif n >= 10 ** 15 cardinal_factor(n, 'billiard', 10 ** 15, gender) elsif n >= 10 ** 12 cardinal_factor(n, 'billion', 10 ** 12, gender) elsif n >= 10 ** 9 cardinal_factor(n, 'milliard', 10 ** 9, gender) elsif n >= 10 ** 6 cardinal_factor(n, 'million', 10 ** 6, gender) elsif n >= 2000 cardinal_factor(n, 'mille', 10 ** 3, gender) elsif n >= 1000 'mille' + simple_cardinal(n % 1000, gender, '-') elsif n > 100 and n % 100 == 0 cardinal_number(n / 100) + '-cents' elsif n >= 200 cardinal_factor(n, 'cent', 100, gender) elsif n >= 100 'cent' + simple_cardinal(n % 100, gender, '-') elsif n > 80 'quatre-vingt' + simple_cardinal(n - 80, gender, '-') elsif n == 80 'quatre-vingts' elsif n == 71 'soixante-et-onze' elsif n > 60 'soixante' + simple_cardinal(n - 60, gender, '-') elsif n > 20 mod = n % 10 simple_cardinal(n / 10 * 10) + simple_cardinal(mod, gender, mod == 1 ? '-et-' : '-') else simple_cardinal(n, gender) end end
ordinal_number(n, gender)
click to toggle source
# File lib/human_numbers/french.rb, line 94 def self.ordinal_number(n, gender) case n when 1; gender == :masculine ? 'premier' : 'première' when 5; 'cinquième' else cardinal_number(n, gender).sub(/f$/, 'v').sub(/e?$/, 'ième') end end
simple_cardinal(n, gender=:masculine, prefix='')
click to toggle source
# File lib/human_numbers/french.rb, line 62 def self.simple_cardinal(n, gender=:masculine, prefix='') return '' if n.zero? prefix + case n when 1; gender == :masculine ? 'un' : 'une' when 2; 'deux' when 3; 'trois' when 4; 'quatre' when 5; 'cinq' when 6; 'six' when 7; 'sept' when 8; 'huit' when 9; 'neuf' when 10; 'dix' when 11; 'onze' when 12; 'douze' when 13; 'treize' when 14; 'quatorze' when 15; 'quinze' when 16; 'seize' when 17; 'dix-sept' when 18; 'dix-huit' when 19; 'dix-neuf' when 20; 'vingt' when 30; 'trente' when 40; 'quarante' when 50; 'cinquante' when 60; 'soixante' end end