[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:000203] [REQ] Integer#{hex,dec,oct,bin}, String#bin
���Ȥ���Ǥ�
# ruby-list �ˤ��褦���Ȱ�ֻפä����� ruby-dev �ˤ��ޤ���
���٤��Ф�����Ǥ�������ϤꡢInteger ����ʬ��ե����ޥåȤ�
���åɤϤʤ��ȥ�åɥ��������³����ݤʤɤ��Ф�������
�Ǥ������� [ruby-dev:4853] �ϡ����椵���ʤ��ĥ�ä��Τ�
�����ޤĤ�Ȥ���Ȥ��ˤϤ�����ޤ���Ǥ������ܤ��⤢���
�긵���ʤ��ΤǤʤ��ʤ�������뼫���Ϥ���ޤ��Ȥꤢ��
����Ƥ��Ƥߤޤ���
�ޤ����������ۤ������äƤΤ�����Ǥ��������פ���ˤۤ����Τ�
������ʤ�Τ��ɲäǤ������ format �ǤϤʤ�ñ��n�ʿ�ɽ��
�ξ�Ǥۤ����Τ��Ȥ������Ȥ��Ǥϼ�ĥ�������Ȼפ��ޤ���
������ n = 2,8,10,16 �Ǥ褤�Ǥ��礦��
���줫�顢̾���Ǥ�������������ľ�� bin, oct, dec, hex �����
���ޤ���to_�ʤ�Ȥ��ǤⰭ���Ϥʤ��Ǥ������ͤ��Ф��ȥ��꤬��
��ޤ���Integer#hex �ΰ�̣�ϼ����Ǥ��礦(�����ˤ�������)��
�����ơ���������̿�Ǥ�������������ʤ��ä�����Ȥ��ƶ��ڤ�
�Ȥ����Τ�����ޤ������Ȥ���12��6845��2035��Ruby�Υ�ƥ���
�� 12_6845_2035 �Ƚޤ������դ�Integer�Τ褦��ɽ����
����ΤϤ�����Ǥ���������������� format �γ�ĥ���н褹��
����Ȥ�פ��ޤ���(�γ�ĥ���ʤΤ�)��
�����ǡ��Ĥ��Τ褦�ʤΤ�ͤ��ޤ���(�Ȥ������ȤäƤޤ�)��
123891790200.hex #=> "1cd886b178b"
123891790200.hex("22") #=> " 1cd886b178"
123891790200.hex("022") #=> "0000000000001cd886b178"
123891790200.hex("22",4) #=> "00_0000_0000_001c_d886_b178"
123891790200.hex("+22",4) #=> "+0_0000_0000_001c_d886_b178"
(-123891790200).hex("+22",4) #=> "-0_0000_0000_001c_d886_b178"
�Ĥޤꡢ��1��������桢���Τ����ȥ����ѥǥ�����ꤷ����2
�����Ƕ��ڤ�������ꤹ��櫓�Ǥ������줬����Ƚ����뤳�ȤϤ�
�ʤ�¿������̾���ⵡǽ��Ǿ��¤��Ȼפ��ޤ����ޤ�����������ʬ
��n�ʿ�ɽ���䤽�ζ��ڤ�����������ĤȤ����Τϼ����ʤ��ȤǤ���
�Ƥʤ��Ρ����̤Υ����ե��������� Integer �Υ��
�ɤȤ���2,8,10,16�ʿ�ɽ�� bin, oct, dec, hex ���ᤷ�ޤ���
���줫�顢16�ʿ���10�ʿ���8�ʿ���ʸ�����������Ѵ������
���åɤϤ���Τ�2�ʿ�ʸ������Ѵ���åɤ�������ˡ����
���Τ�Ŀ�Ū�����ؤʤΤǡ�String#bin ��ꥯ�����Ȥ��ޤ���
�о����Τ���� String#to_i ����̾�Ȥ��� String#dec �⤢���
�ɤ��Ȼפ��ޤ�����������ä��ᤷ�ޤ���
-- gotoken
# ���������ʻȤäƤ�Τ�Ĥ��Ȥ��ޤ���
# numrepres.rb
class Integer
def bin(fmt = "", width = 0, sep = ?_)
represent(:bin, fmt, sep, width)
end
def oct(fmt = "", width = 0, sep = ?_)
represent(:oct, fmt, sep, width)
end
def dec(fmt = "", width = 0, sep = ?_)
represent(:dec, fmt, sep, width)
end
def hex(fmt = "", width = 0, sep = ?_)
represent(:hex, fmt, sep, width)
end
private
def represent(base, fmt, sep, width)
case base
when :bin, :oct, :dec
fmt =~ /\A\+?(?:[0]?[1-9][0-9]*)?\Z/ or
raise ArgumentError, "invalid format `#{fmt}'"
when :hex
fmt =~ /\A\+?(?:[0]?[1-9][0-9]*)?[xX]?\Z/ or
raise ArgumentError, "invalid format `#{fmt}'"
end
case base
when :bin
buf = "%#{fmt}b" % self
when :oct
buf = "%#{fmt}o" % self
when :dec
buf = "%#{fmt}d" % self
when :hex
fmt += "x" unless /[xX]\Z/ =~ fmt
buf = "%#{fmt}" % self
end
if width > 0
buf[0].chr +
buf[1..-1].reverse!.gsub(/#{"."*width}/,"\\&#{sep.chr}").reverse!
else
buf
end
end
end
class String
def bin
eval("0b" + (scan(/\A[01][01_]*/)[0]))
end
alias dec to_i
end