ru_propisju 2.1.4 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 2.2.0
2
+
3
+ * Добавлены методы rublej_extended_format, digit_rublej
4
+
1
5
  === 2.1.4
2
6
 
3
7
  * Правильная обработка нулей в суммах
data/README.rdoc CHANGED
@@ -13,7 +13,7 @@
13
13
  == SYNOPSIS:
14
14
 
15
15
  RuPropisju.rublej(123.78) #=> "сто двадцать три рубля 78 копеек"
16
- RuPropisju.propisju_shtuk(212.40, 2, "сволочь", "сволочи", "сволочей") #=> "двести двенадцать целых четыре десятых сволочи"
16
+ RuPropisju.propisju_shtuk(212.40, 2, ["сволочь", "сволочи", "сволочей"]) #=> "двести двенадцать целых четыре десятых сволочи"
17
17
 
18
18
  == REQUIREMENTS:
19
19
 
data/lib/ru_propisju.rb CHANGED
@@ -6,7 +6,7 @@ $KCODE = 'u' if RUBY_VERSION < '1.9.0'
6
6
  # RuPropisju.rublej(123) # "сто двадцать три рубля"
7
7
  module RuPropisju
8
8
 
9
- VERSION = '2.1.4'
9
+ VERSION = '2.2.0'
10
10
 
11
11
  # http://www.xe.com/symbols.php
12
12
  # (лица, приближенные форексам и всяким там валютам и курсам)
@@ -22,7 +22,7 @@ module RuPropisju
22
22
  SUPPORTED_CURRENCIES = CURRENCIES.keys.join ','
23
23
 
24
24
  TRANSLATIONS = {
25
- "ru" => {
25
+ 'ru' => {
26
26
  0 => "",
27
27
  '0' => "ноль",
28
28
  :thousands => ["тысяча", "тысячи", "тысяч"],
@@ -78,7 +78,7 @@ module RuPropisju
78
78
  :usd_integral => ["доллар", "доллара", "долларов"],
79
79
  :usd_fraction => ['цент', 'цента', 'центов'],
80
80
  },
81
- "ua" => {
81
+ 'ua' => {
82
82
  0 => "",
83
83
  '0' => "нуль",
84
84
  :thousands => ["тисяча", "тисячі", "тисяч"],
@@ -133,8 +133,15 @@ module RuPropisju
133
133
  }
134
134
  }
135
135
 
136
+ MONEY_GENDERS = {
137
+ :rub => 1,
138
+ :usd => 1,
139
+ :uah => 2,
140
+ :eur => 1,
141
+ }
142
+
136
143
 
137
- # Кидается при запросе неизвестной валюты
144
+ # Кидается при запросе неизвестной валюты
138
145
  class UnknownCurrency < ArgumentError
139
146
  end
140
147
 
@@ -177,30 +184,35 @@ module RuPropisju
177
184
  # Выводит целое или дробное число как сумму в рублях прописью
178
185
  #
179
186
  # rublej(345.2) #=> "триста сорок пять рублей 20 копеек"
187
+ #
180
188
  def rublej(amount, locale = :ru)
181
- locale_data = pick_locale(TRANSLATIONS, locale)
182
- integrals = locale_data[:rub_integral]
183
- fractions = locale_data[:rub_fraction]
184
-
185
- return zero(locale_data, integrals, fractions, locale == :ru) if amount.zero?
186
-
187
- parts = []
188
- parts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
189
- if amount.kind_of?(Float)
190
- remainder = (amount.divmod(1)[1]*100).round
191
- if (remainder == 100)
192
- parts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
193
- else
194
- kop = remainder.to_i
195
- unless kop.zero?
196
- parts << kop << choose_plural(kop, fractions)
197
- end
198
- end
199
- end
200
-
201
- parts.join(' ')
189
+ integrals_key = :rub_integral
190
+ fractions_key = :rub_fraction
191
+ money_gender = MONEY_GENDERS[:rub]
192
+
193
+ money(amount, locale, integrals_key, fractions_key, money_gender, true)
194
+ end
195
+
196
+ # Выводит целое или дробное число как сумму в расширенном формате
197
+ #
198
+ # rublej_extended_format(345.2) #=> "345 рублей 20 копеек (триста сорок пять рублей 20 копеек)"
199
+ #
200
+ def rublej_extended_format(amount, locale = :ru)
201
+ "#{digit_rublej(amount, locale)} (#{rublej(amount, locale)})"
202
202
  end
203
203
 
204
+ # Выводит целое или дробное число как сумму в рублях и копейках не прописью
205
+ #
206
+ # digit_rublej(345.2) #=> "345 рублей 20 копеек"
207
+ #
208
+
209
+ def digit_rublej(amount, locale = :ru)
210
+ integrals_key = :rub_integral
211
+ fractions_key = :rub_fraction
212
+ money_gender = MONEY_GENDERS[:rub]
213
+
214
+ money(amount, locale, integrals_key, fractions_key, money_gender, true, true)
215
+ end
204
216
  # Выбирает корректный вариант числительного в зависимости от рода и числа и оформляет сумму прописью
205
217
  #
206
218
  # propisju(243) => "двести сорок три"
@@ -216,75 +228,34 @@ module RuPropisju
216
228
  # Выводит целое или дробное число как сумму в гривнах прописью
217
229
  #
218
230
  # griven(32) #=> "тридцать две гривны"
219
- def griven(amount, locale = 'ru')
220
- locale_root = pick_locale(TRANSLATIONS, locale)
221
-
222
- integrals = locale_root[:uah_integral]
223
- fractions = locale_root[:uah_fraction]
224
-
225
- return zero(locale_root, integrals, fractions, locale == 'ru') if amount.zero?
226
-
227
- parts = []
228
- parts << propisju_int(amount.to_i, 2, integrals, locale) unless amount.to_i == 0
229
- if amount.kind_of? Float
230
- remainder = (amount.divmod(1)[1]*100).round
231
- if remainder == 100
232
- parts = [propisju_int(amount.to_i + 1, 2, integrals, locale)]
233
- else
234
- parts << propisju_int(remainder.to_i, 2, fractions, locale)
235
- end
236
- end
237
- parts.join(' ')
231
+ def griven(amount, locale = :ru)
232
+ integrals_key = :uah_integral
233
+ fractions_key = :uah_fraction
234
+ money_gender = MONEY_GENDERS[:uah]
235
+
236
+ money(amount, locale, integrals_key, fractions_key, money_gender)
238
237
  end
239
238
 
240
239
  # Выводит целое или дробное число как сумму в долларах прописью
241
240
  #
242
241
  # dollarov(32) #=> "тридцать два доллара"
243
- def dollarov(amount, locale = 'ru')
244
- parts = []
245
- locale_root = pick_locale(TRANSLATIONS, locale)
246
-
247
- integrals = locale_root[:usd_integral]
248
- fractions = locale_root[:usd_fraction]
249
-
250
- return zero(locale_root, integrals, fractions, locale == 'ru') if amount.zero?
251
-
252
- parts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
253
- if amount.kind_of?(Float)
254
- remainder = (amount.divmod(1)[1]*100).round
255
- if (remainder == 100)
256
- parts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
257
- else
258
- parts << propisju_int(remainder.to_i, 1, fractions, locale)
259
- end
260
- end
242
+ def dollarov(amount, locale = :ru)
243
+ integrals_key = :usd_integral
244
+ fractions_key = :usd_fraction
245
+ money_gender = MONEY_GENDERS[:usd]
261
246
 
262
- parts.join(' ')
247
+ money(amount, locale, integrals_key, fractions_key, money_gender)
263
248
  end
264
249
 
265
250
  # Выводит целое или дробное число как сумму в евро прописью
266
251
  #
267
252
  # evro(32) #=> "тридцать два евро"
268
- def evro(amount, locale = 'ru')
269
- parts = []
270
- locale_data = pick_locale(TRANSLATIONS, locale)
271
-
272
- integrals = locale_data[:eur_integral]
273
- fractions = locale_data[:eur_fraction]
274
-
275
- return zero(locale_root, integrals, fractions, locale == 'ru') if amount.zero?
276
-
277
- parts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
278
- if amount.kind_of?(Float)
279
- remainder = (amount.divmod(1)[1]*100).round
280
- if (remainder == 100)
281
- parts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
282
- else
283
- parts << propisju_int(remainder.to_i, 1, fractions, locale)
284
- end
285
- end
253
+ def evro(amount, locale = :ru)
254
+ integrals_key = :eur_integral
255
+ fractions_key = :eur_fraction
256
+ money_gender = MONEY_GENDERS[:eur]
286
257
 
287
- parts.join(' ')
258
+ money(amount, locale, integrals_key, fractions_key, money_gender)
288
259
  end
289
260
 
290
261
  # Выводит сумму прописью в рублях по количеству копеек
@@ -308,11 +279,45 @@ module RuPropisju
308
279
  elements.join(" ")
309
280
  end
310
281
 
282
+ def money(amount, locale, integrals_key, fractions_key, money_gender, fraction_as_number = false, integrals_as_number = false)
283
+ locale_data = pick_locale(TRANSLATIONS, locale)
284
+ integrals = locale_data[integrals_key]
285
+ fractions = locale_data[fractions_key]
286
+
287
+ return zero(locale_data, integrals, fractions, fraction_as_number, integrals_as_number) if amount.zero?
288
+
289
+ parts = []
290
+ if integrals_as_number
291
+ parts << amount.to_i << choose_plural(amount, integrals) unless amount.to_i == 0
292
+ else
293
+ parts << propisju_int(amount.to_i, money_gender, integrals, locale) unless amount.to_i == 0
294
+ end
295
+
296
+ if amount.kind_of?(Float)
297
+ remainder = (amount.divmod(1)[1]*100).round
298
+ if remainder == 100
299
+ parts = [propisju_int(amount.to_i + 1, money_gender, integrals, locale)]
300
+ else
301
+ if fraction_as_number
302
+ kop = remainder.to_i
303
+ unless kop.zero?
304
+ parts << kop << choose_plural(kop, fractions)
305
+ end
306
+ else
307
+ parts << propisju_int(remainder.to_i, money_gender, fractions, locale)
308
+ end
309
+ end
310
+ end
311
+
312
+ parts.join(' ')
313
+ end
314
+
311
315
  private
312
-
313
- def zero(locale_data, integrals, fractions, fraction_as_number)
316
+
317
+ def zero(locale_data, integrals, fractions, fraction_as_number, integrals_as_number)
318
+ integ = integrals_as_number ? '0' : locale_data['0']
314
319
  frac = fraction_as_number ? '0' : locale_data['0']
315
- parts = [locale_data['0'], integrals[-1], frac, fractions[-1]]
320
+ parts = [integ , integrals[-1], frac, fractions[-1]]
316
321
  parts.join(' ')
317
322
  end
318
323
 
@@ -414,7 +419,7 @@ module RuPropisju
414
419
  # Выдает сумму прописью с учетом дробной доли. Дробная доля округляется до миллионной, или (если
415
420
  # дробная доля оканчивается на нули) до ближайшей доли ( 500 тысячных округляется до 5 десятых).
416
421
  # Дополнительный аргумент - род существительного (1 - мужской, 2- женский, 3-средний)
417
- def propisju_float(num, locale = 'ru')
422
+ def propisju_float(num, locale = :ru)
418
423
  locale_root = pick_locale(DECIMALS, locale)
419
424
  source_expression = locale_root[:prefix][0]
420
425
  target_prefix = locale_root[:prefix][1]
@@ -453,7 +458,9 @@ module RuPropisju
453
458
  locale_root = pick_locale(TRANSLATIONS, locale)
454
459
 
455
460
  # zero!
456
- return [locale_root['0'], item_forms[-1]].compact.join(' ') if amount.zero?
461
+ if amount.zero?
462
+ return [locale_root['0'], item_forms[-1]].compact.join(' ')
463
+ end
457
464
 
458
465
  fractions = [
459
466
  [:trillions, 1_000_000_000_000],
data/ru_propisju.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ru_propisju"
8
- s.version = "2.1.4"
8
+ s.version = "2.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Julik Tarkhanov"]
12
- s.date = "2012-04-02"
12
+ s.date = "2013-03-24"
13
13
  s.email = "me@julik.nl"
14
14
  s.extra_rdoc_files = [
15
15
  "README.rdoc"
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.homepage = "http://github.com/julik/ru_propisju"
27
27
  s.licenses = ["MIT"]
28
28
  s.require_paths = ["lib"]
29
- s.rubygems_version = "1.8.15"
29
+ s.rubygems_version = "1.8.24"
30
30
  s.summary = "C\u{443}\u{43c}\u{43c}\u{430} \u{43f}\u{440}\u{43e}\u{43f}\u{438}\u{441}\u{44c}\u{44e}"
31
31
 
32
32
  if s.respond_to? :specification_version then
@@ -155,7 +155,7 @@ class TestRuPropisju < Test::Unit::TestCase
155
155
  assert_equal "триста тридцать две гривны", RuPropisju.griven(331.995)
156
156
  assert_equal "одна гривна", RuPropisju.grivna(1)
157
157
  assert_equal "три гривны четырнадцать копеек", RuPropisju.grivny(3.14)
158
- assert_equal "ноль гривен 0 копеек", RuPropisju.griven(0)
158
+ assert_equal "ноль гривен ноль копеек", RuPropisju.griven(0)
159
159
 
160
160
  # ua locale
161
161
  assert_equal "сто двадцять три гривні", RuPropisju.griven(123, :ua)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ru_propisju
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.4
4
+ version: 2.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-02 00:00:00.000000000 Z
12
+ date: 2013-03-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jeweler
16
- requirement: &8967760 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *8967760
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rake
27
- requirement: &8967000 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,7 +37,12 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *8967000
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  description:
37
47
  email: me@julik.nl
38
48
  executables: []
@@ -62,7 +72,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
62
72
  version: '0'
63
73
  segments:
64
74
  - 0
65
- hash: 792091439
75
+ hash: -4443001232636317022
66
76
  required_rubygems_version: !ruby/object:Gem::Requirement
67
77
  none: false
68
78
  requirements:
@@ -71,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
81
  version: '0'
72
82
  requirements: []
73
83
  rubyforge_project:
74
- rubygems_version: 1.8.15
84
+ rubygems_version: 1.8.24
75
85
  signing_key:
76
86
  specification_version: 3
77
87
  summary: Cумма прописью