ru_propisju 2.1.1 → 2.1.2

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.1.2 / 2012-03-19
2
+
3
+ * Починено https://github.com/julik/ru_propisju/issues/5
4
+
1
5
  === 2.1.1 / 2011-12-28
2
6
 
3
7
  * Починено https://github.com/julik/ru_propisju/issues/3
data/README.rdoc CHANGED
@@ -12,6 +12,7 @@
12
12
 
13
13
  == SYNOPSIS:
14
14
 
15
+ RuPropisju.rublej(123.78) #=> "сто двадцать три рубля 78 копеек"
15
16
  RuPropisju.propisju_shtuk(212.40, 2, "сволочь", "сволочи", "сволочей") #=> "двести двенадцать целых четыре десятых сволочи"
16
17
 
17
18
  == REQUIREMENTS:
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.1'
9
+ VERSION = '2.1.2'
10
10
 
11
11
  # http://www.xe.com/symbols.php
12
12
  # (лица, приближенные форексам и всяким там валютам и курсам)
@@ -18,6 +18,7 @@ module RuPropisju
18
18
  "uah" => :griven,
19
19
  "eur" => :evro,
20
20
  }
21
+
21
22
  SUPPORTED_CURRENCIES = CURRENCIES.keys.join ','
22
23
 
23
24
  TRANSLATIONS = {
@@ -301,25 +302,27 @@ module RuPropisju
301
302
  end
302
303
 
303
304
  private
304
-
305
- # ранее интерфейс был похож на интерфейс внешний (one_item, two_items, five_items),
306
- # однако списковая форма строк выглядит предпочтительнее, поэтому интерфейс изменен.
307
- # по хорошему надо менять также внешний интерфейс, но это может сломать совместимость
308
- def compose_ordinal(into, remaining_amount, gender, item_forms = [], locale = :ru)
305
+
306
+
307
+ # Cоставляет число прописью для чисел до тысячи
308
+
309
+ def compose_ordinal(remaining_amount_or_nil, gender, item_forms = [], locale = :ru)
310
+
311
+ remaining_amount = remaining_amount_or_nil.to_i
309
312
 
310
313
  locale = locale.to_s
311
314
 
312
315
  rest, rest1, chosen_ordinal, ones, tens, hundreds = [nil]*6
313
316
 
314
- rest = remaining_amount % 1000
317
+ rest = remaining_amount % 1000
315
318
  remaining_amount = remaining_amount / 1000
316
319
  if rest.zero?
317
320
  # последние три знака нулевые
318
- into = item_forms[2] if into.empty?
319
- return [into, remaining_amount]
321
+ return item_forms[2]
320
322
  end
321
323
 
322
324
  locale_root = pick_locale(TRANSLATIONS, locale)
325
+
323
326
  # начинаем подсчет с Rest
324
327
  # сотни
325
328
  hundreds = locale_root[(rest / 100).to_i * 100]
@@ -349,10 +352,9 @@ module RuPropisju
349
352
  tens,
350
353
  ones,
351
354
  item_forms[chosen_ordinal],
352
- into
353
355
  ].compact.reject(&:empty?).join(' ').strip
354
356
 
355
- return [plural, remaining_amount]
357
+ return plural
356
358
  end
357
359
 
358
360
  DECIMALS = {
@@ -394,13 +396,6 @@ module RuPropisju
394
396
  },
395
397
  }
396
398
 
397
-
398
- # DECIMALS = %w( целая десятая сотая тысячная десятитысячная стотысячная
399
- # миллионная десятимиллионная стомиллионная миллиардная десятимиллиардная
400
- # стомиллиардная триллионная
401
- # ).map{|e| [e, e.gsub(/ая$/, "ых"), e.gsub(/ая$/, "ых"), ] }.freeze
402
- #
403
-
404
399
  # Выдает сумму прописью с учетом дробной доли. Дробная доля округляется до миллионной, или (если
405
400
  # дробная доля оканчивается на нули) до ближайшей доли ( 500 тысячных округляется до 5 десятых).
406
401
  # Дополнительный аргумент - род существительного (1 - мужской, 2- женский, 3-средний)
@@ -437,29 +432,37 @@ module RuPropisju
437
432
  # five_items - родительный падеж множественного числа ( = 5-10)
438
433
  #
439
434
  # Примерно так:
440
- # propisju(42, 1, "сволочь", "сволочи", "сволочей") # => "сорок две сволочи"
435
+ # propisju(42, 1, ["сволочь", "сволочи", "сволочей"]) # => "сорок две сволочи"
441
436
  def propisju_int(amount, gender = 1, item_forms = [], locale = :ru)
442
-
437
+
443
438
  locale_root = pick_locale(TRANSLATIONS, locale)
444
-
445
- return locale_root['0'] + ' ' + item_forms[2] if amount.zero?
446
-
447
- # единицы
448
- into, remaining_amount = compose_ordinal('', amount, gender, item_forms, locale)
449
439
 
450
- return into if remaining_amount.zero?
451
-
452
- [:thousands, :millions, :billions].each do |elem|
453
- into, remaining_amount = compose_ordinal(
454
- into,
455
- remaining_amount,
456
- gender = (elem == :thousands ? 2 : 1), # пол женский только для тысяч
457
- locale_root[elem],
458
- locale
459
- )
460
- return into if remaining_amount.zero?
440
+ fractions = {
441
+ :trillions => 1_000_000_000_000,
442
+ :billions => 1_000_000_000,
443
+ :millions => 1_000_000,
444
+ :thousands => 1_000,
445
+ }
446
+
447
+ parts = fractions.map do | name, multiplier |
448
+ [name, fraction = (amount / multiplier) % 1000]
461
449
  end
462
-
450
+
451
+ # Единицы обрабатываем отдельно
452
+ ones = amount % 1000
453
+
454
+ # Составляем простые тысячные доли
455
+ parts_in_writing = parts.reject do | part |
456
+ part[1].zero?
457
+ end.map do | name, fraction |
458
+ thousandth_gender = (name == :thousands) ? 2 : 1
459
+ compose_ordinal(fraction, thousandth_gender, locale_root[name], locale)
460
+ end
461
+
462
+ # И только единицы обрабатываем с переданными параметрами
463
+ parts_in_writing.push(compose_ordinal(ones, gender, item_forms, locale))
464
+
465
+ parts_in_writing.compact.join(' ')
463
466
  end
464
467
 
465
468
  def pick_locale(from_hash, locale)
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.1"
8
+ s.version = "2.1.2"
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-02-29"
12
+ s.date = "2012-03-19"
13
13
  s.email = "me@julik.nl"
14
14
  s.extra_rdoc_files = [
15
15
  "README.rdoc"
@@ -51,6 +51,8 @@ class TestRuPropisju < Test::Unit::TestCase
51
51
  def test_propisju_for_ints
52
52
  assert_equal "пятьсот двадцать три", RuPropisju.propisju(523, 1)
53
53
  assert_equal "шесть тысяч семьсот двадцать семь", RuPropisju.propisju(6727, 1)
54
+ assert_equal "один миллион один", RuPropisju.propisju(1_000_001, 1)
55
+ assert_equal "один миллион", RuPropisju.propisju(1_000_000, 1)
54
56
  assert_equal "восемь миллионов шестьсот пятьдесят два", RuPropisju.propisju(8000652, 1)
55
57
  assert_equal "восемь миллионов шестьсот пятьдесят две", RuPropisju.propisju(8000652, 2)
56
58
  assert_equal "восемь миллионов шестьсот пятьдесят два", RuPropisju.propisju(8000652, 3)
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.1
4
+ version: 2.1.2
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-02-29 00:00:00.000000000 Z
12
+ date: 2012-03-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jeweler
16
- requirement: &4132640 !ruby/object:Gem::Requirement
16
+ requirement: &3876260 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *4132640
24
+ version_requirements: *3876260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &4132360 !ruby/object:Gem::Requirement
27
+ requirement: &3875960 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *4132360
35
+ version_requirements: *3875960
36
36
  description:
37
37
  email: me@julik.nl
38
38
  executables: []