Module: Num2words::Locales::SV

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

Constant Summary collapse

ONES_MASC =
I18n.t("num2words.ones_masc", locale: :sv)
ONES_FEM =
I18n.t("num2words.ones_fem", locale: :sv)
TEENS =
I18n.t("num2words.teens", locale: :sv)
TENS =
I18n.t("num2words.tens", locale: :sv)
HUNDREDS =
I18n.t("num2words.hundreds", locale: :sv)
SCALES =
I18n.t("num2words.scales", locale: :sv)
FRACTIONS =
I18n.t("num2words.fractions", locale: :sv)
GRAMMAR =
I18n.t("num2words.grammar", locale: :sv)
DATE =
I18n.t("num2words.date", locale: :sv)
DATE_TEMPLATE =
I18n.t("num2words.date.template", locale: :sv)
TIME =
I18n.t("num2words.time", locale: :sv)
TIME_TEMPLATE =
I18n.t("num2words.time.template", locale: :sv)
DATETIME_TEMPLATE =
I18n.t("num2words.datetime.template", locale: :sv)
ORDINALS =
I18n.t("num2words.numbers.ordinals", locale: :sv)
COMMON_GENDER_MAJOR_CURRENCIES =
%i[
  BDT BGN BRL BYN CNY CZK DKK EUR HUF IDR ILS INR IRR JPY KES KRW
  KZT MYR NOK PKR PLN RON RSD RUB SAR SEK THB TRY UAH USD VND
].freeze

Class Method Summary collapse

Class Method Details

.cardinal(number, feminine: false) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/num2words/locales/sv.rb', line 98

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

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

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

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

.currency_major_feminine?(currency) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
# File 'lib/num2words/locales/sv.rb', line 55

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

.currency_minor_feminine?(_currency) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/num2words/locales/sv.rb', line 59

def currency_minor_feminine?(_currency)
  false
end

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



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

def currency_number_words(number, currency, unit:)
  feminine = unit == :major && currency_major_feminine?(currency)
  cardinal(number, feminine: feminine)
end

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



81
82
83
# File 'lib/num2words/locales/sv.rb', line 81

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

.date_year(year, format:) ⇒ Object



85
86
87
# File 'lib/num2words/locales/sv.rb', line 85

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

.decimal_fraction_words(fraction_string) ⇒ Object



51
52
53
# File 'lib/num2words/locales/sv.rb', line 51

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

.decimal_separator_wordObject



47
48
49
# File 'lib/num2words/locales/sv.rb', line 47

def decimal_separator_word
  "komma"
end

.default_fraction_wordObject



39
40
41
# File 'lib/num2words/locales/sv.rb', line 39

def default_fraction_word
  GRAMMAR[:default_fraction]
end

.fraction_joiner(joiner) ⇒ Object



35
36
37
# File 'lib/num2words/locales/sv.rb', line 35

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

.fraction_numerator_feminine?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/num2words/locales/sv.rb', line 43

def fraction_numerator_feminine?
  false
end

.integer_to_words(number, feminine: false) ⇒ Object



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

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

.minus_wordObject



31
32
33
# File 'lib/num2words/locales/sv.rb', line 31

def minus_word
  GRAMMAR[:minus]
end

.one_word(number, feminine:) ⇒ Object



147
148
149
# File 'lib/num2words/locales/sv.rb', line 147

def one_word(number, feminine:)
  feminine ? ONES_FEM[number] : ONES_MASC[number]
end

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



89
90
91
92
93
94
95
96
# File 'lib/num2words/locales/sv.rb', line 89

def ordinal(value, format, gender: :masculine)
  ordinals = ORDINALS[format] || 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



151
152
153
# File 'lib/num2words/locales/sv.rb', line 151

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

.scale_number_words(number, scale_idx, feminine:) ⇒ Object



122
123
124
125
126
127
# File 'lib/num2words/locales/sv.rb', line 122

def scale_number_words(number, scale_idx, feminine:)
  return "ett" if scale_idx == 1 && number == 1
  return "en" if scale_idx > 1 && number == 1

  under_thousand(number, feminine: feminine)
end

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



72
73
74
75
76
77
78
79
# File 'lib/num2words/locales/sv.rb', line 72

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

  words = []
  words << scale_number_words(number, scale_idx, feminine: feminine)
  words << pluralize(number, *SCALES[scale_idx]) unless scale_idx.zero?
  words
end

.under_hundred(number, feminine: false) ⇒ Object



139
140
141
142
143
144
145
# File 'lib/num2words/locales/sv.rb', line 139

def under_hundred(number, feminine: false)
  return one_word(number, feminine: feminine) if number < 10
  return TEENS[number - 10] if number < 20
  return TENS[number / 10] if (number % 10).zero?

  "#{TENS[number / 10]}#{one_word(number % 10, feminine: feminine)}"
end

.under_thousand(number, feminine: false) ⇒ Object



129
130
131
132
133
134
135
136
137
# File 'lib/num2words/locales/sv.rb', line 129

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

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