Number base conversion is when you express a stored integer in an integer base, such as in octal (base 8) or binary (base 2). It also is involved when you take a string representing a number in a given base and convert it to the stored integer form. Normally, a stored integer is in binary, but that's typically invisible to the user, who normally enters or sees stored integers as decimal.



Task

Write a function (or identify the built-in function) which is passed a non-negative integer to convert, and another integer representing the base.

It should return a string containing the digits of the resulting number, without leading zeros except for the number   0   itself.

For the digits beyond 9, one should use the lowercase English alphabet, where the digit   a = 9+1,   b = a+1,   etc.

For example:   the decimal number   26   expressed in base   16   would be   1a.

Write a second function which is passed a string and an integer base, and it returns an integer representing that string interpreted in that base.

The programs may be limited by the word size or other such constraint of a given language. There is no need to do error checking for negatives, bases less than 2, or inappropriate digits.




/* NetRexx */
options replace format comments java crossref symbols nobinary
 
import java.math.BigInteger
 
numeric digits 200
 
parse arg input -- input should be val, radix; no input results in using default test data
-- test data - number pairs where 1st is value and 2nd is target radix
inputs = [ -
  '1234,         10', '01234,  8', 'fe,  16', 'f0e,   16', -
  '0,            10', '00,     2', '11,   2', '070,    8', -
  '77,            8', 'f0e,   16', '070, 16', '0xf0e, 36', -
  '000999ABCXYZ, 36', 'ff,    36', 'f,   16', 'z,     37'  -
  ]
if input.length() > 0 then inputs = [input] -- replace test data with user input
 
loop i_ = 0 to inputs.length - 1
  do
    in = inputs[i_]
    parse in val . ',' radix .
    valB = toDecimal(val, radix)        -- NetRexx default is to store digits as Rexx strings
    valD = fromDecimal(valB + 0, radix) -- Add zero just to prove the result treated as a number
    say val.right(16)'['radix.right(2, 0)']:' valB.right(16)'[10] ==' valD.right(16)'['radix.right(2, 0)']'
  catch nx = NumberFormatException
    say 'Error -- Input:' val', radix:' radix
    nx.printStackTrace()
  end
  end i_
 
return
 
method toDecimal(val = String, radix = int 10) public static returns Rexx
  bi = BigInteger(val, radix)
  return bi.toString()
 
method fromDecimal(val = String, radix = int 10) public static returns Rexx
  bi = BigInteger(val.toString(), 10)
  return bi.toString(radix)
 