diff --git a/plugins/Math.py b/plugins/Math.py index d8e43a77a..012c54c16 100644 --- a/plugins/Math.py +++ b/plugins/Math.py @@ -64,23 +64,53 @@ class Math(callbacks.Privmsg): # one can do list comprehensions or call __...__ functions. ### def base(self, irc, msg, args): - """ + """ [] - Converts from base the number + Converts from base to base . If is left + out, it converts to decimal. """ - (base, number) = privmsgs.getArgs(args, required=2) + (frm, to, number) = privmsgs.getArgs(args, required=2, optional=1) + if number == '': + number = to + to = '10' try: - base = int(base) - if not (2 <= base <= 36): + frm = int(frm) + to = int(to) + if not ((2 <= frm <= 36) and (2 <= to <= 36)): raise ValueError except ValueError: - irc.error(' must be a number between 2 and 36.') + irc.error('Bases must be numbers between 2 and 36.') return try: - irc.reply(str(long(number, int(base)))) + irc.reply(self._convertBaseToBase(number, to, frm)) except ValueError: - irc.error('Invalid for base %s: %s' % (base, number)) + irc.error('Invalid for base %s: %s' % (frm, number)) + def _convertDecimalToBase(self, number, base): + """ + Convert a decimal number to another base; returns a string. + """ + valStr = '' + if number == 0: + return '0' + while number != 0: + digit = number % base + if digit >= 10: + digit = string.uppercase[digit - 10] + else: + digit = str(digit) + valStr = digit + valStr + number = int(math.floor(number / base)) + return valStr + + def _convertBaseToBase(self, number, toBase, fromBase): + """ + Convert a number from any base, 2 through 36, to any other + base, 2 through 36. Returns a string. + """ + number = long(str(number), fromBase) + return self._convertDecimalToBase(number, toBase) + _mathEnv = {'__builtins__': types.ModuleType('__builtins__'), 'i': 1j} _mathEnv.update(math.__dict__) _mathEnv.update(cmath.__dict__)