ru_propisju 2.1.1 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
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: []