Module: Num2words::Locales::IT

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

Constant Summary collapse

ONES_MASC =
I18n.t("num2words.ones_masc", locale: :it)
ONES_FEM =
I18n.t("num2words.ones_fem", locale: :it)
TEENS =
I18n.t("num2words.teens", locale: :it)
TENS =
I18n.t("num2words.tens", locale: :it)
HUNDREDS =
I18n.t("num2words.hundreds", locale: :it)
SCALES =
I18n.t("num2words.scales", locale: :it)
FRACTIONS =
I18n.t("num2words.fractions", locale: :it)
GRAMMAR =
I18n.t("num2words.grammar", locale: :it)
DATE =
I18n.t("num2words.date", locale: :it)
DATE_TEMPLATE =
I18n.t("num2words.date.template", locale: :it)
TIME =
I18n.t("num2words.time", locale: :it)
TIME_TEMPLATE =
I18n.t("num2words.time.template", locale: :it)
DATETIME_TEMPLATE =
I18n.t("num2words.datetime.template", locale: :it)
ORDINALS =
I18n.t("num2words.numbers.ordinals", locale: :it)
FEMININE_MAJOR_CURRENCIES =
%i[GBP TRY UAH CZK SEK NOK DKK INR IDR PKR].freeze

Class Method Summary collapse

Class Method Details

.cardinal(number, feminine: false) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/num2words/locales/it.rb', line 111

def cardinal(number, feminine: false)
  integer_value = Integer(number)
  negative = integer_value.negative?
  integer_value = integer_value.abs

  return ONES_MASC[0] if integer_value.zero?

  groups = integer_value.to_s
                        .chars.reverse.each_slice(3).map(&:reverse)
                        .map(&:join).map!(&:to_i).reverse

  words = []
  groups.each_with_index do |group_value, index|
    next if group_value.zero?

    scale_idx = groups.size - index - 1
    words.concat triple_to_words(group_value, scale_idx, feminine: feminine)
  end

  words.unshift(minus_word) if negative
  words.join(" ")
end

.currency_major_feminine?(currency) ⇒ Boolean

Returns:

  • (Boolean)


80
81
82
# File 'lib/num2words/locales/it.rb', line 80

def currency_major_feminine?(currency)
  FEMININE_MAJOR_CURRENCIES.include?(currency)
end

.currency_minor_feminine?(_currency) ⇒ Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/num2words/locales/it.rb', line 84

def currency_minor_feminine?(_currency)
  false
end

.currency_number_words(number, currency, unit:) ⇒ Object



88
89
90
91
92
# File 'lib/num2words/locales/it.rb', line 88

def currency_number_words(number, currency, unit:)
  feminine = unit == :major ? currency_major_feminine?(currency) : currency_minor_feminine?(currency)

  cardinal(number, feminine: feminine)
end

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



94
95
96
# File 'lib/num2words/locales/it.rb', line 94

def date_day(day, format:, date_case:)
  cardinal(day)
end

.date_year(year, format:) ⇒ Object



98
99
100
# File 'lib/num2words/locales/it.rb', line 98

def date_year(year, format:)
  cardinal(year)
end

.decimal_fraction_words(fraction_string) ⇒ Object



72
73
74
# File 'lib/num2words/locales/it.rb', line 72

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

.decimal_separator_wordObject



68
69
70
# File 'lib/num2words/locales/it.rb', line 68

def decimal_separator_word
  GRAMMAR[:conjunction]
end

.default_fraction_wordObject



60
61
62
# File 'lib/num2words/locales/it.rb', line 60

def default_fraction_word
  GRAMMAR[:default_fraction]
end

.fraction_joiner(joiner) ⇒ Object



56
57
58
# File 'lib/num2words/locales/it.rb', line 56

def fraction_joiner(joiner)
  joiner.to_sym == :and ? "e" : GRAMMAR[:conjunction]
end

.fraction_numerator_feminine?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/num2words/locales/it.rb', line 64

def fraction_numerator_feminine?
  false
end

.integer_to_words(number, feminine: false) ⇒ Object



28
29
30
# File 'lib/num2words/locales/it.rb', line 28

def integer_to_words(number, feminine: false)
  cardinal(number, feminine: feminine)
end

.minus_wordObject



52
53
54
# File 'lib/num2words/locales/it.rb', line 52

def minus_word
  GRAMMAR[:minus]
end

.ordinal(value, format, gender: :masculine) ⇒ Object



102
103
104
105
106
107
108
109
# File 'lib/num2words/locales/it.rb', line 102

def ordinal(value, format, gender: :masculine)
  ordinals = ORDINALS[format] || ORDINALS[:default] || ORDINALS[:nominative]
  gender_data = ordinals[gender] || ordinals[:masculine]

  return gender_data[value - 1] if value.between?(1, gender_data.length)

  cardinal(value)
end

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



162
163
164
# File 'lib/num2words/locales/it.rb', line 162

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

.time_unit_feminine?(unit) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/num2words/locales/it.rb', line 76

def time_unit_feminine?(unit)
  unit == :hour
end

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



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/num2words/locales/it.rb', line 32

def triple_to_words(number, scale_idx, feminine: false)
  return [] if number.zero?

  words = []

  if scale_idx == 1
    return [SCALES[1][0]] if number == 1

    words << under_thousand(number, feminine: feminine)
    words << SCALES[1][1]
  elsif scale_idx.positive?
    words << (number == 1 ? "un" : under_thousand(number, feminine: feminine))
    words << pluralize(number, *SCALES[scale_idx])
  else
    words << under_thousand(number, feminine: feminine)
  end

  words
end

.under_hundred(number, feminine: false) ⇒ Object



147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/num2words/locales/it.rb', line 147

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

  tens = number / 10
  ones = number % 10
  return TENS[tens] if ones.zero?

  tens_word = TENS[tens]
  tens_word = tens_word[0...-1] if [1, 8].include?(ones)
  "#{tens_word}#{ones_data[ones]}"
end

.under_thousand(number, feminine: false) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/num2words/locales/it.rb', line 134

def under_thousand(number, feminine: false)
  return under_hundred(number, feminine: feminine) if number < 100

  hundreds = number / 100
  rest = number % 100
  hundred_word = HUNDREDS[hundreds]
  hundred_word = hundred_word[0...-1] if rest.between?(80, 89)

  return hundred_word if rest.zero?

  "#{hundred_word}#{under_hundred(rest, feminine: feminine)}"
end