Module: Num2words::Locales::RO

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

Constant Summary collapse

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

Class Method Summary collapse

Class Method Details

.cardinal(number, gender: :masculine) ⇒ Object



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

def cardinal(number, gender: :masculine)
  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: gender == :feminine && scale_idx.zero?)
  end

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

.currency_major_feminine?(currency) ⇒ Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/num2words/locales/ro.rb', line 78

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

.currency_minor_feminine?(currency) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/num2words/locales/ro.rb', line 82

def currency_minor_feminine?(currency)
  FEMININE_MINOR_CURRENCIES.include?(currency)
end

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



86
87
88
89
90
91
92
93
94
# File 'lib/num2words/locales/ro.rb', line 86

def currency_number_words(number, currency, unit:)
  gender = if unit == :major
             currency_major_feminine?(currency) ? :feminine : :masculine
           else
             currency_minor_feminine?(currency) ? :feminine : :masculine
           end

  cardinal(number, gender: gender)
end

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



96
97
98
# File 'lib/num2words/locales/ro.rb', line 96

def date_day(day, format:, date_case:)
  ordinal(day, :default)
end

.date_year(year, format:) ⇒ Object



100
101
102
# File 'lib/num2words/locales/ro.rb', line 100

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

.decimal_fraction_words(fraction_string) ⇒ Object



65
66
67
# File 'lib/num2words/locales/ro.rb', line 65

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

.decimal_separator_wordObject



61
62
63
# File 'lib/num2words/locales/ro.rb', line 61

def decimal_separator_word
  "virgulă"
end

.default_fraction_wordObject



53
54
55
# File 'lib/num2words/locales/ro.rb', line 53

def default_fraction_word
  GRAMMAR[:default_fraction]
end

.fraction_joiner(joiner) ⇒ Object



49
50
51
# File 'lib/num2words/locales/ro.rb', line 49

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

.fraction_numerator_feminine?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/num2words/locales/ro.rb', line 57

def fraction_numerator_feminine?
  true
end

.integer_to_words(number, feminine: false) ⇒ Object



29
30
31
# File 'lib/num2words/locales/ro.rb', line 29

def integer_to_words(number, feminine: false)
  cardinal(number, gender: feminine ? :feminine : :masculine)
end

.minus_wordObject



45
46
47
# File 'lib/num2words/locales/ro.rb', line 45

def minus_word
  GRAMMAR[:minus]
end

.needs_de_before_scale?(number) ⇒ Boolean

Returns:

  • (Boolean)


144
145
146
# File 'lib/num2words/locales/ro.rb', line 144

def needs_de_before_scale?(number)
  number >= 20
end

.one_word(number, gender:) ⇒ Object



169
170
171
172
173
# File 'lib/num2words/locales/ro.rb', line 169

def one_word(number, gender:)
  return ONES_FEM[number] if gender == :feminine

  ONES_MASC[number]
end

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



104
105
106
107
108
109
110
111
# File 'lib/num2words/locales/ro.rb', line 104

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, gender: gender)
end

.pluralize(number, singular, few, _plural) ⇒ Object



175
176
177
# File 'lib/num2words/locales/ro.rb', line 175

def pluralize(number, singular, few, _plural)
  number.abs == 1 ? singular : few
end

.scale_number_words(number, scale_idx) ⇒ Object



136
137
138
139
140
141
142
# File 'lib/num2words/locales/ro.rb', line 136

def scale_number_words(number, scale_idx)
  return ["o"] if scale_idx == 1 && number == 1
  return ["un"] if scale_idx > 1 && number == 1
  return ["două"] if number == 2

  [under_thousand(number, gender: :masculine)]
end

.time_number_words(number, unit:) ⇒ Object



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

def time_number_words(number, unit:)
  gender = time_unit_feminine?(unit) ? :feminine : :masculine
  cardinal(number, gender: gender)
end

.time_unit_feminine?(unit) ⇒ Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/num2words/locales/ro.rb', line 69

def time_unit_feminine?(unit)
  %i[hour second].include?(unit)
end

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



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/num2words/locales/ro.rb', line 33

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

  return [under_thousand(number, gender: feminine ? :feminine : :masculine)] if scale_idx.zero?

  scale = pluralize(number, *SCALES[scale_idx])
  words = scale_number_words(number, scale_idx)
  words << "de" if needs_de_before_scale?(number)
  words << scale
  words
end

.under_hundred(number, gender: :masculine) ⇒ Object



158
159
160
161
162
163
164
165
166
167
# File 'lib/num2words/locales/ro.rb', line 158

def under_hundred(number, gender: :masculine)
  return one_word(number, gender: gender) if number < 10
  return TEENS[number - 10] if number < 20

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

  [TENS[tens], one_word(ones, gender: gender)].join(" și ")
end

.under_thousand(number, gender: :masculine) ⇒ Object



148
149
150
151
152
153
154
155
156
# File 'lib/num2words/locales/ro.rb', line 148

def under_thousand(number, gender: :masculine)
  return under_hundred(number, gender: gender) if number < 100

  hundreds = number / 100
  rest = number % 100
  words = [HUNDREDS[hundreds]]
  words << under_hundred(rest, gender: gender) if rest.positive?
  words.join(" ")
end