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

Class Method Details

.extend(cls, *methods) ⇒ nil

Добавляет метод или методы RuNumerals классу. Если опции не указаны, то классу добавляются все подходящие функции.

Examples:


RuNumerals::extend(Integer)                 #=> nil
1.ru_numeral                                #=> "один"
1.ru_ordinal("д")                           #=> "первому"
RuNumerals::extend(Float,:ru_rubleskopecks) #=> nil
1.25.ru_rubleskopecks("и",:nospellkop)      #=> "один рубль 25 копеек"

Parameters:

  • cls (Class)

    объект для преобразования

  • methods (Array)

    методы

    • :ru_numeral (Symbol) - добавить метод ru_numeral (только для Integer)

    • :ru_ordinal (Symbol) - добавить метод ru_ordinal (только для Integer)

    • :ru_date (Symbol) - добавить метод ru_date (только для Time)

    • :ru_time (Symbol) - добавить метод ru_time (только для Time)

    • :ru_fractional (Symbol) - добавить метод ru_fractional (только для Float и Rational)

    • :ru_money (Symbol) - добавить метод ru_money (только для Float)

    • :ru_rubles (Symbol) - добавить метод ru_rubles (только для Float)

    • :ru_kopecks (Symbol) - добавить метод ru_kopecks (только для Float)

    • :ru_rubleskopecks (Symbol) - добавить метод ru_rubleskopecks (только для Float)

    • :ru_dollars (Symbol) - добавить метод ru_dollars (только для Float)

    • :ru_cents (Symbol) - добавить метод ru_cents (только для Float)

    • :ru_dollarscents (Symbol) - добавить метод ru_dollarscents (только для Float)

    • :ru_euros (Symbol) - добавить метод ru_euros (только для Float)

    • :ru_eurocents (Symbol) - добавить метод ru_eurocents (только для Float)

    • :ru_euroseurocents (Symbol) - добавить метод ru_euroseurocents (только для Float)

Returns:

  • (nil)

Raises:

  • (ArgumentError)


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)

Examples:


RuNumerals::ru_cents(2123.29)           #=> "двести двенадцать тысяч триста двадцать девять центов"
RuNumerals::ru_cents(3,"т",spellkop: false) #=> "300 центами"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellkop (true, false) — default: true

    преобразовать в числительное число центов, значение выводится в формате “%02d”

Returns:

  • (String)

Raises:

  • (ArgumentError)


744
745
746
# File 'lib/ru_numerals.rb', line 744

def ru_cents(n,gr_casus="и",**options)
	ru_money(n,gr_casus,nil,CENTGRAM,options)
end

.ru_date(d, gr_casus = "и", **options) ⇒ String

Преобразует объект класса Time в текстовое представление даты

Examples:


RuNumerals::ru_date(Time.now)                                 #=> "девятое ноября две тысячи шестнадцатого года"
RuNumerals::ru_date(Time.now, "д",spellyy: false)             #=> "девятому ноября 2016 года"
RuNumerals::ru_date(Time.now, spelldd: false, spellyy: false) #=> "9 ноября 2016 года"

Parameters:

  • d (Time)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spelldd (true, false) — default: true

    преобразовать в числительное число месяца

  • :spellyy (true, false) — default: true

    преобразовать в числительное год

Returns:

  • (String)

Raises:

  • (ArgumentError)


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="и", **options )
	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
	options.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

Преобразует число в текстовое представление денежной суммы в долларах. Дробная часть отбрасываются.

Examples:


RuNumerals::ru_dollars(2123.29)           #=> "две тысячи сто двадцать три доллара"
RuNumerals::ru_dollars(3,"т",spellrub: false) #=> "3 долларами"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellrub (true, false) — default: true

    преобразовать в числительное число долларов

Returns:

  • (String)

Raises:

  • (ArgumentError)


728
729
730
# File 'lib/ru_numerals.rb', line 728

def ru_dollars(n,gr_casus="и",**options)
	ru_money(n,gr_casus,DOLLARGRAM,nil,options)
end

.ru_dollarscents(n, gr_casus = "и", **options) ⇒ String

Преобразует число в текстовое представление денежной суммы в долларах и центах

Examples:


RuNumerals::ru_dollarscents(2123.29)           #=> "две тысячи сто двадцать три доллара двадцать девять центов"
RuNumerals::ru_dollarscents(3,"т",spellkop: false) #=> "тремя долларами 00 центов"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellrub (true, false) — default: true

    преобразовать в числительное число долларов

  • :spellkop (true, false) — default: true

    преобразовать в числительное число центов, значение выводится в формате “%02d”

Returns:

  • (String)

Raises:

  • (ArgumentError)


761
762
763
# File 'lib/ru_numerals.rb', line 761

def ru_dollarscents(n,gr_casus="и",**options)
	ru_money(n,gr_casus,DOLLARGRAM,CENTGRAM,options)
end

.ru_eurocents(n, gr_casus = "и", **options) ⇒ String

Преобразует число в текстовое представление денежной суммы в евроцентах (n*100)

Examples:


RuNumerals::ru_eurocents(2123.29)           #=> "двести двенадцать тысяч триста двадцать девять евроцентов"
RuNumerals::ru_eurocents(3,"т",spellkop: false) #=> "300 евроцентами"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellkop (true, false) — default: true

    преобразовать в числительное число евроцентов, значение выводится в формате “%02d”

Returns:

  • (String)

Raises:

  • (ArgumentError)


793
794
795
# File 'lib/ru_numerals.rb', line 793

def ru_eurocents(n,gr_casus="и",**options)
	ru_money(n,gr_casus,nil,EUROCENTGRAM,options)
end

.ru_euros(n, gr_casus = "и", **options) ⇒ String

Преобразует число в текстовое представление денежной суммы в евро. Дробная часть отбрасываются.

Examples:


RuNumerals::ru_euros(2123.29)           #=> "две тысячи сто двадцать три евро"
RuNumerals::ru_euros(3,"т",spellrub: false) #=> "3 евро"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellrub (true, false) — default: true

    преобразовать в числительное число евро

Returns:

  • (String)

Raises:

  • (ArgumentError)


777
778
779
# File 'lib/ru_numerals.rb', line 777

def ru_euros(n,gr_casus="и",**options)
	ru_money(n,gr_casus,EUROGRAM,nil,options)
end

.ru_euroseurocents(n, gr_casus = "и", **options) ⇒ String

Преобразует число в текстовое представление денежной суммы в евро и евроцентах

Examples:


RuNumerals::ru_euroseurocents(2123.29)           #=> "две тысячи сто двадцать три евро двадцать девять евроцентов"
RuNumerals::ru_euroseurocents(3,"т",spellkop: false) #=> "тремя долларами 00 евроцентов"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellrub (true, false) — default: true

    преобразовать в числительное число евро

  • :spellkop (true, false) — default: true

    преобразовать в числительное число евроцентов, значение выводится в формате “%02d”

Returns:

  • (String)

Raises:

  • (ArgumentError)


810
811
812
# File 'lib/ru_numerals.rb', line 810

def ru_euroseurocents(n,gr_casus="и",**options)
	ru_money(n,gr_casus,EUROGRAM,EUROCENTGRAM,options)
end

.ru_fractional(n, gr_casus = "и", grammar = nil, **options) ⇒ String

Преобразует дробное число в его текстовое представление

Если знаменатель равен единице (аргумент типа Integer как частный случай), то результатом будет количественное числительное (будет осуществлен вызов ru_numeral)

Examples:


RuNumerals::ru_fractional(Rational(8,7))                   #=> "одна целая одна седьмая"
RuNumerals::ru_fractional(Rational(8,7),"",improper: true) #=> "восемь седьмых"
RuNumerals::ru_fractional(Rational(8,7),improper: true)    #=> "восемь седьмых"
RuNumerals::ru_fractional(Rational(6,2),"т")               #=> "тремя"
RuNumerals::ru_fractional(1001.02)                         #=> "одна тысяча одна целая две сотых"

Parameters:

  • n (Rational, Float, Integer)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • grammar (String) (defaults to: nil)

    грамматика

  • options (Hash)

    опции

Options Hash (**options):

  • :improper (true, false) — default: false

    не преобразовать в правильную дробь

Returns:

  • (String)

Raises:

  • (ArgumentError)


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, **options)
	improper=false
	options.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)

Examples:


RuNumerals::ru_kopecks(2123.29)           #=> "двести двенадцать тысяч триста двадцать девять копеек"
RuNumerals::ru_kopecks(3,"т",spellkop: false) #=> "300 копейками"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellkop (true, false) — default: true

    преобразовать в числительное число копеек, значение выводится в формате “%02d”

Returns:

  • (String)

Raises:

  • (ArgumentError)


695
696
697
# File 'lib/ru_numerals.rb', line 695

def ru_kopecks(n,gr_casus="и",**options)
	ru_money(n,gr_casus,nil,KOPGRAM,options)
end

.ru_money(n, gr_casus, rub_gram, kop_gram, **options) ⇒ String

Преобразует число в текстовое представление денежной суммы

Examples:


RuNumerals::ru_money(123.029,"и",RuNumerals::RUBGRAM,RuNumerals::KOPGRAM)
         #=> "сто двадцать три рубля три копейки"
RuNumerals::ru_money(123.029,"р",RuNumerals::RUBGRAM,RuNumerals::KOPGRAM, spellkop: false)
         #=> "ста двадцати трёх рублей 03 копеек"
RuNumerals::ru_money(123.029,"т",nil,RuNumerals::KOPGRAM)
         #=> "двенадцатью тысячами тремястами тремя копейками"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String)

    падеж числительного

  • rub_gram (String)

    грамматика “рублей”, если nil или “”, то выводятся только “копейки” со значением n*100

  • kop_gram (String)

    грамматика “копеек”, если nil или “”, то “копейки” не выводятся и их значение отбрасывается

  • options (Hash)

    опции

Options Hash (**options):

  • :spellrub (true, false) — default: true

    преобразовать в числительное число “рублей”

  • :spellkop (true, false) — default: true

    преобразовать в числительное число “копеек”, значение выводится в формате “%02d”

Returns:

  • (String)

Raises:

  • (ArgumentError)


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, **options)
	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
	options.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

Преобразует число в количественное числительное

Examples:

RuNumerals::ru_numeral(154,'д')                       #=> "ста пятидесяти четырём"
RuNumerals::ru_numeral(101,'','с',1)                  #=> "ноль тысяч сто одно"
RuNumerals::ru_numeral(1,'',RuNumerals::RUBGRAM,-1)   #=> "рубль"
RuNumerals::ru_numeral(2,'',RuNumerals::RUBGRAM,-1)   #=> "рубля"

Parameters:

  • n (Integer)

    число для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • grammar (String) (defaults to: "мн")

    грамматика

  • minorder (Integer) (defaults to: 0)

    минимальный порядок тысяч (см. примеры). Если минимальный порядок < 0, то собственно числительное не выводится

Returns:

  • (String)

Raises:

  • (ArgumentError)


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

Преобразует число в порядковое числительное

Examples:


RuNumerals::ru_ordinal(1)                 #=> "первый"
RuNumerals::ru_ordinal(2)                 #=> "второй"		
RuNumerals::ru_ordinal(250000000,'в','ж') #=> "двухсотпятидесятимиллионную"
RuNumerals::ru_ordinal(5,'т','ж',true)    #=> "пятыми"
RuNumerals::ru_ordinal(-5,'в','о')        #=> "минус пятого"

Parameters:

  • n (Integer)

    число для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • grammar (String) (defaults to: "мн")

    грамматика

  • plural (true, false) (defaults to: false)

    множественное число

Returns:

  • (String)

Raises:

  • (ArgumentError)


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

Преобразует число в текстовое представление денежной суммы в рублях. Дробная часть отбрасываются.

Examples:


RuNumerals::ru_rubles(2123.29)           #=> "две тысячи сто двадцать три рубля"
RuNumerals::ru_rubles(3,"т", spellrub: false) #=> "3 рублями"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellrub (true, false) — default: true

    преобразовать в числительное число рублей

Returns:

  • (String)

Raises:

  • (ArgumentError)


679
680
681
# File 'lib/ru_numerals.rb', line 679

def ru_rubles(n,gr_casus="и",**options)
	ru_money(n,gr_casus,RUBGRAM,nil,options)
end

.ru_rubleskopecks(n, gr_casus = "и", **options) ⇒ String

Преобразует число в текстовое представление денежной суммы в рублях и копейках

Examples:


RuNumerals::ru_rubleskopecks(2123.29)           #=> "две тысячи сто двадцать три рубля двадцать девять копеек"
RuNumerals::ru_rubleskopecks(3,"т",spellkop: false) #=> "тремя рублями 00 копеек"

Parameters:

  • n (Integer, Float)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellrub (true, false) — default: true

    преобразовать в числительное число рублей

  • :spellkop (true, false) — default: true

    преобразовать в числительное число копеек, значение выводится в формате “%02d”

Returns:

  • (String)

Raises:

  • (ArgumentError)


712
713
714
# File 'lib/ru_numerals.rb', line 712

def ru_rubleskopecks(n,gr_casus="и",**options)
	ru_money(n,gr_casus,RUBGRAM,KOPGRAM,options)
end

.ru_time(d, gr_casus = "и", **options) ⇒ String

Преобразует объект класса Time в текстовое представление времени

Examples:


RuNumerals::ru_time(Time.now)                                      
        #=> "восемнадцать часов пятьдесят две минуты двадцать секунд"
RuNumerals::ru_time(Time.now,"д",spellhh: false , spellmm: false , spellss: false)
        #=> "18 часам 52 минутам 20 секундам"
RuNumerals::ru_time(Time.now,'',spellhh: false , spellmm: false , noseconds: false)
        #=> "18 часов 52 минуты"

Parameters:

  • d (Time)

    объект для преобразования

  • gr_casus (String) (defaults to: "и")

    падеж числительного

  • options (Hash)

    опции

Options Hash (**options):

  • :spellhh (true, false) — default: true

    преобразовать в числительное часы

  • :spellmm (true, false) — default: true

    преобразовать в числительное минуты

  • :spellss (true, false) — default: true

    преобразовать в числительное секунды

  • :seconds (true, false) — default: true

    показывать секунды

Returns:

  • (String)

Raises:

  • (ArgumentError)


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="и", **options)
	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
	options.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