# HG changeset patch # User Paul Boddie # Date 1481417394 -3600 # Node ID 0613a74e6acae0f4e28479a7b8fc5b46793da1ef # Parent ff3ebfe09afc76e3002252684ec1b3822642cb43 Implemented hex and oct, adding tests. diff -r ff3ebfe09afc -r 0613a74e6aca lib/__builtins__/character.py --- a/lib/__builtins__/character.py Sun Dec 11 01:37:33 2016 +0100 +++ b/lib/__builtins__/character.py Sun Dec 11 01:49:54 2016 +0100 @@ -22,8 +22,51 @@ from native import str_ord def chr(i): pass -def hex(number): pass -def oct(number): pass + +_hexdigits = "0123456789abcdef" + +def _base(number, base, prefix=""): + + """ + Return 'number' encoded in the given 'base', prefixed with 'prefix'. + """ + + if number < 0: + number = -number + sign = "-" + else: + sign = "" + + digits = [] + + while number: + digits.append(_hexdigits[number % base]) + number = number / base + + digits.append(prefix) + + if sign: + digits.append(sign) + + return "".join(reversed(digits)) + +def hex(number, prefix="0x"): + + """ + Return 'number' encoded as a hexadecimal (base 16) value, prefixed with + 'prefix' ("0x" by default). + """ + + return _base(number, 16, prefix) + +def oct(number, prefix="0"): + + """ + Return 'number' encoded as an octal (base 8) value, prefixed with 'prefix' + ("0" by default). + """ + + return _base(number, 8, prefix) def ord(c): diff -r ff3ebfe09afc -r 0613a74e6aca tests/numbers.py --- a/tests/numbers.py Sun Dec 11 01:37:33 2016 +0100 +++ b/tests/numbers.py Sun Dec 11 01:49:54 2016 +0100 @@ -7,9 +7,13 @@ i = 2 ** 30 print i # 1073741824 +print hex(i) # 0x40000000 +print oct(i) # 010000000000 j = -2 ** 30 print j # -1073741824 +print hex(j) # -0x40000000 +print oct(j) # -010000000000 print i + j # 0 @@ -33,3 +37,6 @@ print ~j # 1073741823 print i & ~j # 0 print i - 1 & ~j # 1073741823 + +print hex(31) # 0x1f +print oct(31) # 037