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 +4 -0
- data/README.rdoc +1 -0
- data/lib/ru_propisju.rb +40 -37
- data/ru_propisju.gemspec +2 -2
- data/test/test_ru_propisju.rb +2 -0
- metadata +6 -6
data/History.txt
CHANGED
data/README.rdoc
CHANGED
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.
|
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
|
-
|
306
|
-
#
|
307
|
-
|
308
|
-
def compose_ordinal(
|
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
|
317
|
+
rest = remaining_amount % 1000
|
315
318
|
remaining_amount = remaining_amount / 1000
|
316
319
|
if rest.zero?
|
317
320
|
# последние три знака нулевые
|
318
|
-
|
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
|
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
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
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.
|
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-
|
12
|
+
s.date = "2012-03-19"
|
13
13
|
s.email = "me@julik.nl"
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"README.rdoc"
|
data/test/test_ru_propisju.rb
CHANGED
@@ -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.
|
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-
|
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: &
|
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: *
|
24
|
+
version_requirements: *3876260
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
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: *
|
35
|
+
version_requirements: *3875960
|
36
36
|
description:
|
37
37
|
email: me@julik.nl
|
38
38
|
executables: []
|