[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