ru_propisju 2.0.0 → 2.1.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 +5 -0
- data/lib/ru_propisju.rb +54 -43
- data/ru_propisju.gemspec +2 -2
- data/test/test_ru_propisju.rb +10 -4
- metadata +6 -6
data/History.txt
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.
|
9
|
+
VERSION = '2.1.0'
|
10
10
|
|
11
11
|
# http://www.xe.com/symbols.php
|
12
12
|
# (лица, приближенные форексам и всяким там валютам и курсам)
|
@@ -136,11 +136,17 @@ module RuPropisju
|
|
136
136
|
# Кидается при запросе неизвестной валюты
|
137
137
|
class UnknownCurrency < ArgumentError
|
138
138
|
end
|
139
|
-
|
139
|
+
|
140
|
+
# Кидается при запросе неизвестного языка
|
141
|
+
class UnknownLocale < ArgumentError
|
142
|
+
end
|
143
|
+
|
140
144
|
# Выбирает нужный падеж существительного в зависимости от числа
|
141
145
|
#
|
142
146
|
# choose_plural(3, "штука", "штуки", "штук") #=> "штуки"
|
143
|
-
def choose_plural(amount, variants)
|
147
|
+
def choose_plural(amount, *variants)
|
148
|
+
variants = variants.flatten
|
149
|
+
|
144
150
|
mod_ten = amount % 10
|
145
151
|
mod_hundred = amount % 100
|
146
152
|
variant = if (mod_ten == 1 && mod_hundred != 11)
|
@@ -171,27 +177,27 @@ module RuPropisju
|
|
171
177
|
#
|
172
178
|
# rublej(345.2) #=> "триста сорок пять рублей 20 копеек"
|
173
179
|
def rublej(amount, locale = :ru)
|
174
|
-
|
175
|
-
locale_root = TRANSLATIONS
|
176
|
-
|
180
|
+
parts = []
|
181
|
+
locale_root = pick_locale(TRANSLATIONS, locale)
|
182
|
+
|
177
183
|
integrals = locale_root[:rub_integral]
|
178
184
|
fractions = locale_root[:rub_fraction]
|
179
185
|
|
180
|
-
|
186
|
+
parts << propisju_shtuk(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
|
181
187
|
|
182
188
|
if amount.kind_of?(Float)
|
183
189
|
remainder = (amount.divmod(1)[1]*100).round
|
184
190
|
if remainder == 100
|
185
|
-
|
191
|
+
parts = [propisju_shtuk(amount.to_i+1, 1, integrals, locale)]
|
186
192
|
else
|
187
193
|
kop = remainder.to_i
|
188
194
|
unless kop.zero?
|
189
|
-
|
195
|
+
parts << kop << choose_plural(kop, fractions)
|
190
196
|
end
|
191
197
|
end
|
192
198
|
end
|
193
199
|
|
194
|
-
|
200
|
+
parts.join(' ')
|
195
201
|
end
|
196
202
|
|
197
203
|
# Выбирает корректный вариант числительного в зависимости от рода и числа и оформляет сумму прописью
|
@@ -210,68 +216,68 @@ module RuPropisju
|
|
210
216
|
#
|
211
217
|
# griven(32) #=> "тридцать две гривны"
|
212
218
|
def griven(amount, locale = 'ru')
|
213
|
-
locale_root = TRANSLATIONS
|
214
|
-
|
219
|
+
locale_root = pick_locale(TRANSLATIONS, locale)
|
220
|
+
|
215
221
|
integrals = locale_root[:uah_integral]
|
216
222
|
fractions = locale_root[:uah_fraction]
|
217
223
|
|
218
|
-
|
219
|
-
|
224
|
+
parts = []
|
225
|
+
parts << propisju_int(amount.to_i, 2, integrals, locale) unless amount.to_i == 0
|
220
226
|
if amount.kind_of? Float
|
221
227
|
remainder = (amount.divmod(1)[1]*100).round
|
222
228
|
if remainder == 100
|
223
|
-
|
229
|
+
parts = [propisju_int(amount.to_i + 1, 2, integrals, locale)]
|
224
230
|
else
|
225
|
-
|
231
|
+
parts << propisju_int(remainder.to_i, 2, fractions, locale)
|
226
232
|
end
|
227
233
|
end
|
228
|
-
|
234
|
+
parts.join(' ')
|
229
235
|
end
|
230
236
|
|
231
237
|
# Выводит целое или дробное число как сумму в долларах прописью
|
232
238
|
#
|
233
239
|
# dollarov(32) #=> "тридцать два доллара"
|
234
240
|
def dollarov(amount, locale = 'ru')
|
235
|
-
|
236
|
-
locale_root = TRANSLATIONS
|
237
|
-
|
241
|
+
parts = []
|
242
|
+
locale_root = pick_locale(TRANSLATIONS, locale)
|
243
|
+
|
238
244
|
integrals = locale_root[:usd_integral]
|
239
245
|
fractions = locale_root[:usd_fraction]
|
240
246
|
|
241
|
-
|
247
|
+
parts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
|
242
248
|
if amount.kind_of?(Float)
|
243
249
|
remainder = (amount.divmod(1)[1]*100).round
|
244
250
|
if (remainder == 100)
|
245
|
-
|
251
|
+
parts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
|
246
252
|
else
|
247
|
-
|
253
|
+
parts << propisju_int(remainder.to_i, 1, fractions, locale)
|
248
254
|
end
|
249
255
|
end
|
250
256
|
|
251
|
-
|
257
|
+
parts.join(' ')
|
252
258
|
end
|
253
259
|
|
254
260
|
# Выводит целое или дробное число как сумму в евро прописью
|
255
261
|
#
|
256
262
|
# evro(32) #=> "тридцать два евро"
|
257
263
|
def evro(amount, locale = 'ru')
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
integrals =
|
262
|
-
fractions =
|
264
|
+
parts = []
|
265
|
+
locale_data = pick_locale(TRANSLATIONS, locale)
|
266
|
+
|
267
|
+
integrals = locale_data[:eur_integral]
|
268
|
+
fractions = locale_data[:eur_fraction]
|
263
269
|
|
264
|
-
|
270
|
+
parts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
|
265
271
|
if amount.kind_of?(Float)
|
266
272
|
remainder = (amount.divmod(1)[1]*100).round
|
267
273
|
if (remainder == 100)
|
268
|
-
|
274
|
+
parts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
|
269
275
|
else
|
270
|
-
|
276
|
+
parts << propisju_int(remainder.to_i, 1, fractions, locale)
|
271
277
|
end
|
272
278
|
end
|
273
279
|
|
274
|
-
|
280
|
+
parts.join(' ')
|
275
281
|
end
|
276
282
|
|
277
283
|
# Выводит сумму прописью в рублях по количеству копеек
|
@@ -300,8 +306,8 @@ module RuPropisju
|
|
300
306
|
# ранее интерфейс был похож на интерфейс внешний (one_item, two_items, five_items),
|
301
307
|
# однако списковая форма строк выглядит предпочтительнее, поэтому интерфейс изменен.
|
302
308
|
# по хорошему надо менять также внешний интерфейс, но это может сломать совместимость
|
303
|
-
def compose_ordinal(into, remaining_amount, gender, item_forms=[], locale = :ru)
|
304
|
-
locale = locale.
|
309
|
+
def compose_ordinal(into, remaining_amount, gender, item_forms = [], locale = :ru)
|
310
|
+
locale = locale.to_s
|
305
311
|
|
306
312
|
rest, rest1, chosen_ordinal, ones, tens, hundreds = [nil]*6
|
307
313
|
#
|
@@ -313,7 +319,7 @@ module RuPropisju
|
|
313
319
|
return [into, remaining_amount]
|
314
320
|
end
|
315
321
|
|
316
|
-
locale_root = TRANSLATIONS
|
322
|
+
locale_root = pick_locale(TRANSLATIONS, locale)
|
317
323
|
# начинаем подсчет с Rest
|
318
324
|
# сотни
|
319
325
|
hundreds = locale_root[(rest / 100).to_i * 100]
|
@@ -347,7 +353,7 @@ module RuPropisju
|
|
347
353
|
end
|
348
354
|
|
349
355
|
DECIMALS = {
|
350
|
-
|
356
|
+
'ru' =>{
|
351
357
|
:source_words => [
|
352
358
|
'целая',
|
353
359
|
'десятая',
|
@@ -365,7 +371,7 @@ module RuPropisju
|
|
365
371
|
],
|
366
372
|
:prefix => ["ая", 'ых'],
|
367
373
|
},
|
368
|
-
|
374
|
+
'ua' => {
|
369
375
|
:source_words => [
|
370
376
|
'ціла',
|
371
377
|
'десята',
|
@@ -395,8 +401,8 @@ module RuPropisju
|
|
395
401
|
# Выдает сумму прописью с учетом дробной доли. Дробная доля округляется до миллионной, или (если
|
396
402
|
# дробная доля оканчивается на нули) до ближайшей доли ( 500 тысячных округляется до 5 десятых).
|
397
403
|
# Дополнительный аргумент - род существительного (1 - мужской, 2- женский, 3-средний)
|
398
|
-
def propisju_float(num, locale =
|
399
|
-
locale_root = DECIMALS
|
404
|
+
def propisju_float(num, locale = 'ru')
|
405
|
+
locale_root = pick_locale(DECIMALS, locale)
|
400
406
|
source_expression = locale_root[:prefix][0]
|
401
407
|
target_prefix = locale_root[:prefix][1]
|
402
408
|
words = locale_root[:source_words].map do |e|
|
@@ -431,7 +437,7 @@ module RuPropisju
|
|
431
437
|
# propisju(42, 1, "сволочь", "сволочи", "сволочей") # => "сорок две сволочи"
|
432
438
|
def propisju_int(amount, gender = 1, item_forms = [], locale = :ru)
|
433
439
|
|
434
|
-
locale_root = TRANSLATIONS
|
440
|
+
locale_root = pick_locale(TRANSLATIONS, locale)
|
435
441
|
|
436
442
|
return locale_root['0'] + ' ' + item_forms[2] if amount.zero?
|
437
443
|
|
@@ -452,7 +458,12 @@ module RuPropisju
|
|
452
458
|
end
|
453
459
|
|
454
460
|
end
|
455
|
-
|
461
|
+
|
462
|
+
def pick_locale(from_hash, locale)
|
463
|
+
return from_hash[locale.to_s] if from_hash.has_key?(locale.to_s)
|
464
|
+
raise UnknownLocale, "Unknown locale #{locale.inspect}"
|
465
|
+
end
|
466
|
+
|
456
467
|
alias_method :rublja, :rublej
|
457
468
|
alias_method :rubl, :rublej
|
458
469
|
|
@@ -467,5 +478,5 @@ module RuPropisju
|
|
467
478
|
|
468
479
|
public_instance_methods(true).map{|m| module_function(m) }
|
469
480
|
|
470
|
-
module_function :propisju_int, :propisju_float, :compose_ordinal
|
481
|
+
module_function :propisju_int, :propisju_float, :compose_ordinal, :pick_locale
|
471
482
|
end
|
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.
|
8
|
+
s.version = "2.1.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 = "2011-12-
|
12
|
+
s.date = "2011-12-28"
|
13
13
|
s.email = "me@julik.nl"
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"README.rdoc"
|
data/test/test_ru_propisju.rb
CHANGED
@@ -92,17 +92,23 @@ class TestRuPropisju < Test::Unit::TestCase
|
|
92
92
|
assert_equal "триста сорок одна ціла двісті сорок п'ять тисячних", RuPropisju.propisju(341.245, 1, :ua)
|
93
93
|
assert_equal "двісті три цілих сорок одна сота", RuPropisju.propisju(203.41, 1, :ua)
|
94
94
|
assert_equal "чотиреста сорок дві цілих п'ять десятих", RuPropisju.propisju(442.50000, 1, :ua)
|
95
|
-
|
95
|
+
|
96
|
+
# unknown locale
|
97
|
+
assert_raise(RuPropisju::UnknownLocale) do
|
98
|
+
assert_equal "чотиреста сорок дві цілих п'ять десятих", RuPropisju.propisju(442.50000, 1, :kg)
|
99
|
+
end
|
96
100
|
end
|
97
|
-
|
101
|
+
|
98
102
|
def test_choose_plural
|
99
103
|
assert_equal "чемодана", RuPropisju.choose_plural(523, ["чемодан", "чемодана", "чемоданов"])
|
100
104
|
assert_equal "партий", RuPropisju.choose_plural(6727, ["партия", "партии", "партий"])
|
101
105
|
assert_equal "козлов", RuPropisju.choose_plural(45, ["козел", "козла", "козлов"])
|
102
106
|
assert_equal "колес", RuPropisju.choose_plural(260, ["колесо", "колеса", "колес"])
|
103
|
-
|
107
|
+
|
108
|
+
# splat args
|
109
|
+
assert_equal "колес", RuPropisju.choose_plural(260, "колесо", "колеса", "колес")
|
110
|
+
|
104
111
|
# ua locale
|
105
|
-
|
106
112
|
assert_equal "валізи", RuPropisju.choose_plural(523, ["валіза", "валізи", "валіз"])
|
107
113
|
assert_equal "партій", RuPropisju.choose_plural(6727, ["партія", "партії", "партій"])
|
108
114
|
assert_equal "козлів", RuPropisju.choose_plural(45, ["козел", "козла", "козлів"])
|
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.
|
4
|
+
version: 2.1.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: 2011-12-
|
12
|
+
date: 2011-12-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: jeweler
|
16
|
-
requirement: &
|
16
|
+
requirement: &10722980 !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: *10722980
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &10722720 !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: *10722720
|
36
36
|
description:
|
37
37
|
email: me@julik.nl
|
38
38
|
executables: []
|