Module: RuNumerals
- Defined in:
- lib/version.rb,
lib/ru_numerals.rb
Constant Summary collapse
- VERSION =
RuNumerals version
'1.0.2'
- RUBGRAM =
Грамматика слова “рубль”
"мн|рубль|рубля|рублю|рубль|рублём|рубле|рубли|рублей|рублям|рубли|рублями|рублях"
- KOPGRAM =
Грамматика слова “копейка”
"жн|копейка|копейки|копейке|копейку|копейкой|копейке|копейки|копеек|копейкам|копейки|копейками|копейках"
- DOLLARGRAM =
Грамматика слова “доллар”
"мн|доллар|доллара|доллару|доллар|долларом|долларе|доллары|долларов|долларам|доллары|долларами|долларах"
- CENTGRAM =
Грамматика слова “цент”
"мн|цент|цента|центу|цент|центом|центе|центы|центов|центам|центы|центами|центах"
- EUROGRAM =
Грамматика слова “евро”
"мн|евро|евро|евро|евро|евро|евро|евро|евро|евро|евро|евро|евро"
- EUROCENTGRAM =
Грамматика слова “евроцент”
"мн|евроцент|евроцента|евроценту|евроцент|евроцентом|евроценте|евроценты|евроцентов|евроцентам|евроценты|евроцентами|центах"
Class Method Summary collapse
-
.extend(cls, *methods) ⇒ nil
Добавляет метод или методы RuNumerals классу.
-
.ru_cents(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в центах (n*100).
-
.ru_date(d, gr_casus = "и", **options) ⇒ String
Преобразует объект класса
Time
в текстовое представление даты. -
.ru_dollars(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в долларах.
-
.ru_dollarscents(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в долларах и центах.
-
.ru_eurocents(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в евроцентах (n*100).
-
.ru_euros(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в евро.
-
.ru_euroseurocents(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в евро и евроцентах.
-
.ru_fractional(n, gr_casus = "и", grammar = nil, **options) ⇒ String
Преобразует дробное число в его текстовое представление.
-
.ru_kopecks(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в копейках (n*100).
-
.ru_money(n, gr_casus, rub_gram, kop_gram, **options) ⇒ String
Преобразует число в текстовое представление денежной суммы.
-
.ru_numeral(n, gr_casus = "и", grammar = "мн", minorder = 0) ⇒ String
Преобразует число в количественное числительное.
-
.ru_ordinal(n, gr_casus = "и", grammar = "мн", plural = false) ⇒ String
Преобразует число в порядковое числительное.
-
.ru_rubles(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в рублях.
-
.ru_rubleskopecks(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в рублях и копейках.
-
.ru_time(d, gr_casus = "и", **options) ⇒ String
Преобразует объект класса
Time
в текстовое представление времени.
Class Method Details
.extend(cls, *methods) ⇒ nil
Добавляет метод или методы RuNumerals классу. Если опции не указаны, то классу добавляются все подходящие функции.
844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 |
# File 'lib/ru_numerals.rb', line 844 def extend(cls,*methods) if ( cls.class != Class ) then raise ArgumentError, %Q/Argument must be Class, current argument class is "#{cls.Class}, "/, caller end if not EXTEND_MAP.keys.include?(cls) then raise ArgumentError, %Q/Class "#{cls}" is not supported/, caller end if methods.nil? or methods.empty? then all_methods=true else all_methods=false methods.each do |i| if not EXTEND_MAP[cls].include?(i) then raise ArgumentError, %Q/Method "#{i}" is not supported for class "#{cls}"/, caller end end end methods_to_ext= (all_methods ? EXTEND_MAP[cls] : methods) methods_to_ext.each do |i| case i when :ru_numeral then cls.send(:define_method,i) do |gr_casus='и', grammar='мн', min_order=0| RuNumerals::ru_numeral(self, gr_casus, grammar, min_order) end when :ru_ordinal then cls.send(:define_method,i) do |gr_casus='и', grammar='мн', plural=false| RuNumerals::ru_ordinal(self, gr_casus, grammar, plural) end when :ru_money then cls.send(:define_method,i) do |gr_casus='и', r_gram=nil,k_gram=nil, **opts| RuNumerals::ru_money(self, gr_casus,r_gram,k_gram,opts) end when :ru_date then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_date(self, gr_casus, opts) end when :ru_time then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_time(self, gr_casus, opts) end when :ru_rubles then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_rubles(self, gr_casus, opts) end when :ru_kopecks then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_kopecks(self, gr_casus, opts) end when :ru_rubleskopecks then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_rubleskopecks(self, gr_casus, opts) end when :ru_dollars then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_dollars(self, gr_casus, opts) end when :ru_cents cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_cents(self, gr_casus, opts) end when :ru_dollarscents then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_dollarscents(self, gr_casus, opts) end when :ru_euros then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_euros(self, gr_casus, opts) end when :ru_eurocents then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_eurocents(self, gr_casus, opts) end when :ru_euroseurocents then cls.send(:define_method,i) do |gr_casus='и', **opts| RuNumerals::ru_euroseurocents(self, gr_casus, opts) end when :ru_fractional then cls.send(:define_method,i) do |gr_casus='и', grammar=nil, **opts| RuNumerals::ru_fractional(self, gr_casus, grammar, opts) end end end nil end |
.ru_cents(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в центах (n*100)
744 745 746 |
# File 'lib/ru_numerals.rb', line 744 def ru_cents(n,gr_casus="и",**) ru_money(n,gr_casus,nil,CENTGRAM,) end |
.ru_date(d, gr_casus = "и", **options) ⇒ String
Преобразует объект класса Time
в текстовое представление даты
470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 |
# File 'lib/ru_numerals.rb', line 470 def ru_date(d, gr_casus="и", ** ) if not d.kind_of?(Time) then raise ArgumentError, %Q/The argument must be Time class. Argument has class "#{d.class}", value "#{d}"/, caller end spelldd=true spellyy=true .each do |k,v| case k when :spelldd then spelldd=v when :spellyy then spellyy=v else raise ArgumentError, %Q/Invalid option key #{k} value "#{v}"/, caller end end if spelldd then day_part=ru_ordinal(d.day,gr_casus,"с") else day_part=d.day.to_s end day_part + " " + MONTAB[d.mon-1] + " " + (spellyy ? ru_ordinal(d.year,"р",YEARGRAM) : (d.year.to_s + " года")) end |
.ru_dollars(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в долларах. Дробная часть отбрасываются.
728 729 730 |
# File 'lib/ru_numerals.rb', line 728 def ru_dollars(n,gr_casus="и",**) ru_money(n,gr_casus,DOLLARGRAM,nil,) end |
.ru_dollarscents(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в долларах и центах
761 762 763 |
# File 'lib/ru_numerals.rb', line 761 def ru_dollarscents(n,gr_casus="и",**) ru_money(n,gr_casus,DOLLARGRAM,CENTGRAM,) end |
.ru_eurocents(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в евроцентах (n*100)
793 794 795 |
# File 'lib/ru_numerals.rb', line 793 def ru_eurocents(n,gr_casus="и",**) ru_money(n,gr_casus,nil,EUROCENTGRAM,) end |
.ru_euros(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в евро. Дробная часть отбрасываются.
777 778 779 |
# File 'lib/ru_numerals.rb', line 777 def ru_euros(n,gr_casus="и",**) ru_money(n,gr_casus,EUROGRAM,nil,) end |
.ru_euroseurocents(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в евро и евроцентах
810 811 812 |
# File 'lib/ru_numerals.rb', line 810 def ru_euroseurocents(n,gr_casus="и",**) ru_money(n,gr_casus,EUROGRAM,EUROCENTGRAM,) end |
.ru_fractional(n, gr_casus = "и", grammar = nil, **options) ⇒ String
Преобразует дробное число в его текстовое представление
Если знаменатель равен единице (аргумент типа Integer
как частный случай), то результатом будет количественное числительное (будет осуществлен вызов ru_numeral)
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 |
# File 'lib/ru_numerals.rb', line 614 def ru_fractional(n,gr_casus="и",grammar=nil, **) improper=false .each do |k,v| case k when :improper then improper=v else raise ArgumentError, %Q/Invalid option key #{k} value "#{v}"/, caller end end if n.kind_of?(Integer) then numer=n denom=1 elsif n.kind_of?(Float) then m=n.to_s.match('([-+]?[0-9]+)\.([0-9]+)([eE]([-+][0-9]+))?') numer=(m[1] + m[2]).to_i denom_order=(m[2].length - (m[3].nil? ? 0 : m[4].to_i)) while denom_order < 0 numer*=10 denom_order+=1 end while numer%10 == 0 && denom_order > 0 numer/=10 denom_order-=1 end denom=10**denom_order elsif n.kind_of?(Rational) then numer=n.numerator denom=n.denominator else raise ArgumentError, %Q/The number must be one of Rational, Float or Integer. Argument has class "#{n.class}", value "#{n}"/, caller end if denom == 1 then return ru_numeral(numer, gr_casus, grammar) end if (not improper) && numer.abs >= denom then t_str=ru_numeral((numer < 0 ? -(numer.abs/denom) : numer/denom),gr_casus,WHOLEGRAM) numer=numer.abs%denom else t_str="" end if not numer.zero? then t_str << " " if not t_str.empty? t_str << ru_numeral(numer,gr_casus,"ж") + " " if numer%10 == 1 then t_str << ru_ordinal(denom,gr_casus,"ж") elsif gr_casus == "и" then t_str << ru_ordinal(denom,"р","ж",true) else t_str << ru_ordinal(denom,gr_casus,"ж",true) end end t_str + (grammar.nil? ? "" : (" " + ru_numeral(1,"р",grammar,-1))) end |
.ru_kopecks(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в копейках (n*100)
695 696 697 |
# File 'lib/ru_numerals.rb', line 695 def ru_kopecks(n,gr_casus="и",**) ru_money(n,gr_casus,nil,KOPGRAM,) end |
.ru_money(n, gr_casus, rub_gram, kop_gram, **options) ⇒ String
Преобразует число в текстовое представление денежной суммы
553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 |
# File 'lib/ru_numerals.rb', line 553 def ru_money(n,gr_casus,rub_gram, kop_gram, **) if not (n.kind_of?(Integer) || n.kind_of?(Float)) then raise ArgumentError, %Q/The number must be Integer or Float. Argument has class "#{n.class}", value "#{n}"/, caller end n=n.to_f spellrub=true spellkop=true .each do |k,v| case k when :spellrub then spellrub=v when :spellkop then spellkop=v else raise ArgumentError, %Q/Invalid option key #{k} value "#{v}"/, caller end end if (rub_gram.nil? || rub_gram.empty?) && (kop_gram.nil? || kop_gram.empty? ) then raise ArgumentError, %Q/Both grammars are nil/, caller end if rub_gram.nil? || rub_gram.empty? then kops=(n*100).round if spellkop then return ru_numeral(kops,gr_casus,kop_gram) else return kops.to_s + " " + ru_numeral(kops,gr_casus,kop_gram,-1) end end rubs=n.truncate kops=((n*100)%100).round if spellrub then rub_s=ru_numeral(rubs,gr_casus,rub_gram) else rub_s=rubs.to_s + " " + ru_numeral(rubs,gr_casus,rub_gram,-1) end return rub_s if ( kop_gram.nil? || kop_gram.empty? ) if spellkop then kop_s=ru_numeral(kops,gr_casus,kop_gram) else kop_s=("%02d" % kops.to_s) + " " + ru_numeral(kops,gr_casus,kop_gram,-1) end rub_s + " " + kop_s end |
.ru_numeral(n, gr_casus = "и", grammar = "мн", minorder = 0) ⇒ String
Преобразует число в количественное числительное
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 |
# File 'lib/ru_numerals.rb', line 367 def ru_numeral(n,gr_casus = "и", grammar = "мн", minorder = 0) if not n.kind_of?(Integer) then raise ArgumentError, %Q/The number must be Integer. Argument has class "#{n.class}", value "#{n}"/, caller end gr_casus="и" if gr_casus.nil? || gr_casus.empty? minorder=minorder.to_i set_grammar(grammar) @animate=false if n > 10 and n%10 != 1 casus=CASUS_STR.index(gr_casus.downcase) if not casus raise ArgumentError, %Q/The grammatical case must be one of "ирдвтп". Current value of argument is "#{gr_casus}"/, caller end if n < 0 then is_negative=true n=-n else is_negative=false end order=get_order(n) if order > ORDWORD.length then raise ArgumentError, %Q/Too big number #{n}. Max number supported is #{10**((ORDWORD.length+1)*3) - 1}/, caller end triad=0 return get_tail(n%1000,casus,@animate,0) if minorder < 0 t_str= is_negative ? "минус " : "" [[minorder,ORDWORD.length].min,order].max.downto(0) do |i| triad=(n/(10**(3*i)))%1000 t_str << milli(triad,casus,@gender,@animate,i) + " " if triad.nonzero? || t_str.empty? end t_str << get_grammar(0,1,1) if triad.zero? && n.nonzero? t_str.rstrip end |
.ru_ordinal(n, gr_casus = "и", grammar = "мн", plural = false) ⇒ String
Преобразует число в порядковое числительное
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 |
# File 'lib/ru_numerals.rb', line 417 def ru_ordinal(n, gr_casus = "и", grammar = "мн", plural = false) if not n.kind_of?(Integer) then raise ArgumentError, %Q/The number must be Integer. Argument has class "#{n.class}", value "#{n}"/, caller end gr_casus="и" if gr_casus.nil? || gr_casus.empty? set_grammar(grammar) casus=CASUS_STR.index(gr_casus.downcase) if not casus raise ArgumentError, %Q/The grammatical case must be one of "ирдвтп". Current value of argument is "#{gr_casus}"/, caller end if n < 0 then is_negative=true n=-n else is_negative=false end order=get_order(n) if order > ORDWORD.length then raise ArgumentError, %Q/Too big number #{n}. Max number supported is #{10**((ORDWORD.length+1)*3) - 1}/, caller end @gender=3 if plural if n.zero? then return (ORDINALS[0] + get_ending(0,@animate, @gender, casus) + " " + get_grammar(0, plural ? 1 : 0 , casus)).rstrip end t_str = first_ordinal(n%1000,@animate,@gender,casus) 1.upto(get_order(n)) do |i| triad=(n/(10**(3*i)))%1000 if triad.nonzero? then if not t_str.empty? then t_str = (triad == 1 ? get_grammar(i,0,0) : milli(triad,0,0,false,i)) + " " + t_str else t_str = second_ordinal(triad, i, @animate, @gender, casus) end end end (( is_negative ? "минус " : "" ) + t_str + " " + get_grammar(0, plural ? 1 : 0, casus)).rstrip end |
.ru_rubles(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в рублях. Дробная часть отбрасываются.
679 680 681 |
# File 'lib/ru_numerals.rb', line 679 def ru_rubles(n,gr_casus="и",**) ru_money(n,gr_casus,RUBGRAM,nil,) end |
.ru_rubleskopecks(n, gr_casus = "и", **options) ⇒ String
Преобразует число в текстовое представление денежной суммы в рублях и копейках
712 713 714 |
# File 'lib/ru_numerals.rb', line 712 def ru_rubleskopecks(n,gr_casus="и",**) ru_money(n,gr_casus,RUBGRAM,KOPGRAM,) end |
.ru_time(d, gr_casus = "и", **options) ⇒ String
Преобразует объект класса Time
в текстовое представление времени
511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 |
# File 'lib/ru_numerals.rb', line 511 def ru_time(d, gr_casus="и", **) if not d.kind_of?(Time) then raise ArgumentError, %Q/The argument must be Time class. Argument has class "#{d.class}", value "#{d}"/, caller end spellhh=true spellmm=true spellss=true seconds=true .each do |k,v| case k when :spellhh then spellhh=v when :spellmm then spellmm=v when :spellss then spellss=v when :seconds then seconds=v else raise ArgumentError, %Q/Invalid option key #{k} value "#{v}"/, caller end end (spellhh ? ru_numeral(d.hour, gr_casus, HOURGRAM ) : (d.hour.to_s + " " + ru_numeral(d.hour, gr_casus, HOURGRAM, -1 ))) + " " + (spellmm ? ru_numeral(d.min, gr_casus, MINGRAM ) : (d.min.to_s + " "+ ru_numeral(d.min, gr_casus, MINGRAM, -1 ))) + (seconds ? ( " " + (spellss ? ru_numeral(d.sec, gr_casus, SECGRAM ) : (d.sec.to_s + " " + ru_numeral(d.sec, gr_casus, SECGRAM, -1 )))) : "") end |