Module: Num2words::Locales::BG
- Defined in:
- lib/num2words/locales/bg.rb
Constant Summary collapse
- ONES_MASC =
I18n.t("num2words.ones_masc", locale: :bg)
- ONES_FEM =
I18n.t("num2words.ones_fem", locale: :bg)
- TEENS =
I18n.t("num2words.teens", locale: :bg)
- TENS =
I18n.t("num2words.tens", locale: :bg)
- HUNDREDS =
I18n.t("num2words.hundreds", locale: :bg)
- SCALES =
I18n.t("num2words.scales", locale: :bg)
- FRACTIONS =
I18n.t("num2words.fractions", locale: :bg)
- GRAMMAR =
I18n.t("num2words.grammar", locale: :bg)
- DATE =
I18n.t("num2words.date", locale: :bg)
- DATE_TEMPLATE =
I18n.t("num2words.date.template", locale: :bg)
- TIME =
I18n.t("num2words.time", locale: :bg)
- TIME_TEMPLATE =
I18n.t("num2words.time.template", locale: :bg)
- DATETIME_TEMPLATE =
I18n.t("num2words.datetime.template", locale: :bg)
- ORDINALS =
I18n.t("num2words.numbers.ordinals", locale: :bg)
Class Method Summary collapse
- .cardinal(number, feminine: false) ⇒ Object
- .date_day(day, format:, date_case:) ⇒ Object
- .date_year(year, format:) ⇒ Object
- .default_fraction_word ⇒ Object
- .feminine_group?(scale_idx) ⇒ Boolean
- .fraction_joiner(joiner) ⇒ Object
- .fraction_numerator_feminine? ⇒ Boolean
- .integer_to_words(number, feminine: false) ⇒ Object
- .join_groups(group_phrases) ⇒ Object
- .join_with_conjunction(words, value) ⇒ Object
- .minus_word ⇒ Object
- .ordinal(value, format, gender: :masculine) ⇒ Object
- .pluralize(number, singular, few, plural) ⇒ Object
- .triple_to_words(number, scale_idx, feminine: false) ⇒ Object
Class Method Details
.cardinal(number, feminine: false) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/num2words/locales/bg.rb', line 103 def cardinal(number, feminine: false) integer_value = Integer(number) negative = integer_value.negative? integer_value = integer_value.abs return (feminine ? ONES_FEM[0] : 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 group_phrases = [] groups.each_with_index do |group_value, index| next if group_value.zero? scale_idx = groups.size - index - 1 group_feminine = feminine_group?(scale_idx) || feminine group_words = triple_to_words(group_value, scale_idx, feminine: group_feminine) group_words.shift if scale_idx == 1 && group_value == 1 group_phrases << [group_words.join(" "), scale_idx, group_value] end result = join_groups(group_phrases) negative ? [minus_word, result].join(" ") : result end |
.date_day(day, format:, date_case:) ⇒ Object
76 77 78 79 |
# File 'lib/num2words/locales/bg.rb', line 76 def date_day(day, format:, date_case:) gender = date_case.to_sym == :genitive ? :masculine : :neuter ordinal(day, :nominative, gender: gender) end |
.date_year(year, format:) ⇒ Object
81 82 83 |
# File 'lib/num2words/locales/bg.rb', line 81 def date_year(year, format:) ordinal(year, :nominative) end |
.default_fraction_word ⇒ Object
42 43 44 |
# File 'lib/num2words/locales/bg.rb', line 42 def default_fraction_word GRAMMAR[:default_fraction] end |
.feminine_group?(scale_idx) ⇒ Boolean
26 27 28 |
# File 'lib/num2words/locales/bg.rb', line 26 def feminine_group?(scale_idx) scale_idx == 1 end |
.fraction_joiner(joiner) ⇒ Object
38 39 40 |
# File 'lib/num2words/locales/bg.rb', line 38 def fraction_joiner(joiner) joiner.to_sym == :and ? "и" : GRAMMAR[:conjunction] end |
.fraction_numerator_feminine? ⇒ Boolean
30 31 32 |
# File 'lib/num2words/locales/bg.rb', line 30 def fraction_numerator_feminine? true end |
.integer_to_words(number, feminine: false) ⇒ Object
46 47 48 |
# File 'lib/num2words/locales/bg.rb', line 46 def integer_to_words(number, feminine: false) cardinal(number, feminine: feminine) end |
.join_groups(group_phrases) ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/num2words/locales/bg.rb', line 137 def join_groups(group_phrases) return "" if group_phrases.empty? phrases = group_phrases.map(&:first) last_scale_idx = group_phrases[-1][1] last_value = group_phrases[-1][2] if group_phrases.size > 1 && last_scale_idx.zero? && last_value < 100 [phrases[0...-1].join(" "), phrases[-1]].join(" и ") else phrases.join(" ") end end |
.join_with_conjunction(words, value) ⇒ Object
133 134 135 |
# File 'lib/num2words/locales/bg.rb', line 133 def join_with_conjunction(words, value) words.empty? ? value : "и #{value}" end |
.minus_word ⇒ Object
34 35 36 |
# File 'lib/num2words/locales/bg.rb', line 34 def minus_word GRAMMAR[:minus] end |
.ordinal(value, format, gender: :masculine) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/num2words/locales/bg.rb', line 85 def ordinal(value, format, gender: :masculine) ordinals = ORDINALS[format] gender_data = ordinals[gender] || ordinals[:masculine] return gender_data[value - 1] if value.between?(1, gender_data.length) if value > 31 thousands = (value / 100) * 100 last_two = value % 100 base_year = cardinal(thousands) last_ordinal = gender_data[last_two - 1] || cardinal(last_two) return [base_year, last_ordinal].join(" ") end cardinal(value) end |
.pluralize(number, singular, few, plural) ⇒ Object
129 130 131 |
# File 'lib/num2words/locales/bg.rb', line 129 def pluralize(number, singular, few, plural) number.abs == 1 ? singular : few end |
.triple_to_words(number, scale_idx, feminine: false) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/num2words/locales/bg.rb', line 50 def triple_to_words(number, scale_idx, feminine: false) words = [] hundreds = number / 100 rest = number % 100 words << HUNDREDS[hundreds] if hundreds.positive? if rest.between?(10, 19) words << join_with_conjunction(words, TEENS[rest - 10]) else tens = rest / 10 ones = rest % 10 if tens >= 2 tens_words = TENS[tens] words << (ones.positive? ? "#{tens_words} и #{feminine ? ONES_FEM[ones] : ONES_MASC[ones]}" : tens_words) elsif ones.positive? words << join_with_conjunction(words, feminine ? ONES_FEM[ones] : ONES_MASC[ones]) end end words << pluralize(number, *SCALES[scale_idx]) unless scale_idx.zero? words.compact end |