Module: Num2words::Locales::FR

Defined in:
lib/num2words/locales/fr.rb

Constant Summary collapse

ONES_MASC =
I18n.t("num2words.ones_masc", locale: :fr)
ONES_FEM =
I18n.t("num2words.ones_fem", locale: :fr)
TEENS =
I18n.t("num2words.teens", locale: :fr)
TENS =
I18n.t("num2words.tens", locale: :fr)
HUNDREDS =
I18n.t("num2words.hundreds", locale: :fr)
SCALES =
I18n.t("num2words.scales", locale: :fr)
FRACTIONS =
I18n.t("num2words.fractions", locale: :fr)
GRAMMAR =
I18n.t("num2words.grammar", locale: :fr)
DATE =
I18n.t("num2words.date", locale: :fr)
DATE_TEMPLATE =
I18n.t("num2words.date.template", locale: :fr)
TIME =
I18n.t("num2words.time", locale: :fr)
TIME_TEMPLATE =
I18n.t("num2words.time.template", locale: :fr)
DATETIME_TEMPLATE =
I18n.t("num2words.datetime.template", locale: :fr)
ORDINALS =
I18n.t("num2words.numbers.ordinals", locale: :fr)

Class Method Summary collapse

Class Method Details

.currency_major_feminine?(currency) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/num2words/locales/fr.rb', line 54

def currency_major_feminine?(currency)
  %i[GBP TRY UAH CZK SEK NOK DKK INR IDR PKR].include?(currency)
end

.currency_minor_feminine?(currency) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/num2words/locales/fr.rb', line 58

def currency_minor_feminine?(currency)
  %i[ILS BGN SAR].include?(currency)
end

.date_day(day, format:, date_case:) ⇒ Object



73
74
75
76
77
# File 'lib/num2words/locales/fr.rb', line 73

def date_day(day, format:, date_case:)
  return "premier" if day == 1

  under_thousand(day)
end

.date_year(year, format:) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/num2words/locales/fr.rb', line 79

def date_year(year, format:)
  groups = year.to_s
               .chars.reverse.each_slice(3).map(&:reverse)
               .map(&:join).map!(&:to_i).reverse

  words = []
  groups.each_with_index do |group_value, index|
    scale_index = groups.size - index - 1
    words.concat triple_to_words(group_value, scale_index)
  end

  words.join(" ")
end

.decimal_fraction_words(fraction_string) ⇒ Object



46
47
48
# File 'lib/num2words/locales/fr.rb', line 46

def decimal_fraction_words(fraction_string)
  fraction_string.chars.map { |digit| under_thousand(digit.to_i) }.join(" ")
end

.decimal_separator_wordObject



42
43
44
# File 'lib/num2words/locales/fr.rb', line 42

def decimal_separator_word
  "virgule"
end

.default_fraction_wordObject



34
35
36
# File 'lib/num2words/locales/fr.rb', line 34

def default_fraction_word
  GRAMMAR[:default_fraction]
end

.fraction_joiner(_joiner) ⇒ Object



30
31
32
# File 'lib/num2words/locales/fr.rb', line 30

def fraction_joiner(_joiner)
  GRAMMAR[:conjunction]
end

.fraction_numerator_feminine?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/num2words/locales/fr.rb', line 38

def fraction_numerator_feminine?
  false
end

.minus_wordObject



26
27
28
# File 'lib/num2words/locales/fr.rb', line 26

def minus_word
  GRAMMAR[:minus]
end

.pluralize(number, singular, _few, plural) ⇒ Object



141
142
143
# File 'lib/num2words/locales/fr.rb', line 141

def pluralize(number, singular, _few, plural)
  number.abs == 1 ? singular : plural
end

.time_unit_feminine?(unit) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/num2words/locales/fr.rb', line 50

def time_unit_feminine?(unit)
  unit == :hour || unit == :minute || unit == :second
end

.triple_to_words(number, scale_idx, feminine: false) ⇒ Object



62
63
64
65
66
67
68
69
70
71
# File 'lib/num2words/locales/fr.rb', line 62

def triple_to_words(number, scale_idx, feminine: false)
  words = scale_idx == 1 && number == 1 ? [] : under_thousand(number, feminine: feminine).split

  unless scale_idx.zero?
    scale_forms = SCALES[scale_idx]
    words << (number == 1 ? scale_forms[0] : scale_forms[2])
  end

  words
end

.under_hundred(number, feminine: false) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/num2words/locales/fr.rb', line 112

def under_hundred(number, feminine: false)
  ones_data = feminine ? ONES_FEM : ONES_MASC

  return ones_data[number] if number < 10
  return TEENS[number - 10] if number < 20

  case number
  when 20..69
    tens = number / 10
    ones = number % 10
    return TENS[tens] if ones.zero?
    return "#{TENS[tens]} et #{ones_data[ones]}" if ones == 1

    "#{TENS[tens]} #{ones_data[ones]}"
  when 70..79
    teen = number - 60
    return "soixante et #{TEENS[1]}" if teen == 11

    "soixante #{under_hundred(teen, feminine: feminine)}"
  when 80
    "quatre-vingts"
  else
    rest = number - 80
    return "quatre-vingt" if rest.zero?

    "quatre-vingt #{under_hundred(rest, feminine: feminine)}"
  end
end

.under_thousand(number, feminine: false) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/num2words/locales/fr.rb', line 93

def under_thousand(number, feminine: false)
  hundreds = number / 100
  rest = number % 100

  return under_hundred(rest, feminine: feminine) if hundreds.zero?

  hundred_words = if hundreds == 1
                    HUNDREDS[1]
                  elsif rest.zero?
                    HUNDREDS[hundreds]
                  else
                    HUNDREDS[hundreds].sub(/s\z/, "")
                  end

  return hundred_words if rest.zero?

  [hundred_words, under_hundred(rest, feminine: feminine)].join(" ")
end