SF.net SVN: fclient:[829] trunk/fclient/src/fclient/impl/lib/fcp2/lib/ numbers.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <jU...@us...> - 2008-07-31 10:29:10
|
Revision: 829 http://fclient.svn.sourceforge.net/fclient/?rev=829&view=rev Author: jUrner Date: 2008-07-31 10:29:19 +0000 (Thu, 31 Jul 2008) Log Message: ----------- not used Removed Paths: ------------- trunk/fclient/src/fclient/impl/lib/fcp2/lib/numbers.py Deleted: trunk/fclient/src/fclient/impl/lib/fcp2/lib/numbers.py =================================================================== --- trunk/fclient/src/fclient/impl/lib/fcp2/lib/numbers.py 2008-07-30 22:26:06 UTC (rev 828) +++ trunk/fclient/src/fclient/impl/lib/fcp2/lib/numbers.py 2008-07-31 10:29:19 UTC (rev 829) @@ -1,314 +0,0 @@ -"""Number crunching and others - -""" - -import re -#*************************************************************** -# -#*************************************************************** -class ByteSizeNames: - Binary = ('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB') - Common = ('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB') - - - -def format_num_bytes(num, binary=False, names=None, format_strings=('%i%s', '%01.2f%s') ): - """Formats a number representing a number of bytes to a human readable string - @param num: (int) number to fomat - @param binary: if True conversion factor is 1024, else factor is 1000 - @param names: (tuple) names to use as suffix or None to use default names (see L{ByteSizeNames}) - @param format_strings: (tuple) format strings to be used or None to use the default formating. - The first member of the tuple is used to format bytes, the seconds anything > one kilobyte - @return: (str) formated number - - >>> format_num_bytes(100) - '100B' - - >>> format_num_bytes(1000) - '1.00KB' - - >>> format_num_bytes(1024, binary=True) - '1.00KiB' - - >>> format_num_bytes(1000, names=('W', 'X', 'Y', 'Z')) - '1.00X' - - >>> format_num_bytes(1000, format_strings=('%s%i', '%01.4f%s')) - '1.0000KB' - - """ - if binary: - factor = 1024 - if names is None: - names = ByteSizeNames.Binary - else: - factor = 1000 - if names is None: - names = ByteSizeNames.Common - - name = names[0] - if num >= factor: - num = float(num) - for tmp_name in names[1: ]: - num /= factor - name = tmp_name - if num < factor: - break - else: - return format_strings[0] % (num, name) - return format_strings[1] % (num, name) - - -NumBytesPat = re.compile('''\A (\d+ \. \d+) | (\d+)''', re.X) -def num_bytes_to_bytes(num, binary=False, names=None): - """Converts a string containing a bytes size to an integer - @param num: (str) string to convert - @param binary: if True conversion factor is 1024, else factor is 1000 - @param names: (tuple) names to use as suffix or None to use default names (see L{ByteSizeNames}) - - @return: (int) number of bytes - @note: postfixes are handled case sensitive - - >>> num_bytes_to_bytes('1000B') - 1000 - - >>> num_bytes_to_bytes('1GB') - 1000000000 - - >>> num_bytes_to_bytes('1.2KB') - 1200 - - >>> num_bytes_to_bytes('1.5678B') - 2 - - >>> num_bytes_to_bytes('1MiB', binary=True) - 1048576 - - >>> num_bytes_to_bytes('1X', names=('X', )) - 1 - - >>> num_bytes_to_bytes('foo') - Traceback (most recent call last): - ... - ValueError: No number found in input string - - >>> num_bytes_to_bytes('1foo') - Traceback (most recent call last): - ... - ValueError: Unknown size postfix - """ - if names is None: - if binary: - names = ByteSizeNames.Binary - else: - names = ByteSizeNames.Common - names = list(names) - - match = NumBytesPat.match(num) - if match is None: - raise ValueError('No number found in input string') - - isfloat, isint = match.groups() - if isfloat: - z = len(isfloat) - tmp_num = float(isfloat) - else: - z = len(isint) - tmp_num = int(isint) - - postfix = num[z: ] - try: - exp = names.index(postfix) - except ValueError: - raise ValueError('Unknown size postfix') - factor = 1024 if binary else 1000 - - #TODO: 1.96B is returned rounded as 2. Should we complain? - return int(round(tmp_num * (factor ** exp))) - - -#*************************************************************** -# -#*************************************************************** -TimeDurationNames = { - 'seconds': 's', - 'minutes': 'm', - 'hours': 'h', - 'days': 'd', - 'years': 'y' - } -def format_time_delta(t1, t2, names=None): - """Pretty prints a time delta - @arg t1: duration starting time - @arg t2: duration ending time - @arg names: (optional) dict mapping names to names as they should be - to be printed (see TimeDurationNames) - - >>> import time - >>> t0 = time.time() - - >>> format_time_delta(t0, t0 +1) - '1s' - - >>> format_time_delta(t0, t0) - '0s' - - >>> format_time_delta(t0, t0 +1.4) - '1.4s' - - >>> format_time_delta(t0, t0 +60) - '1m' - - >>> format_time_delta(t0, t0 +12345) - '3.4h' - - >>> format_time_delta(t0, t0 +1234567890) - '39.1y' - - >>> format_time_delta(t0, t0 +1234567890, names={'years': 'leapers', 'seconds': 's', 'minutes': 'm', 'hours': 'h', 'days': 'd'}) - '39.1leapers' - - """ - mapping = ( - ('years', 1), - ('days', 365), - ('hours', 24), - ('minutes', 60), - ('seconds', 60), - ) - if names is None: - names = TimeDurationNames - - delta = t2 - t1 - if delta < 0: - t = n = 0 - name = 'seconds' - else: - start = (60 * 60 * 24 * 365) - for name, fac in mapping: - start = start / fac - t = delta / start - t = round(t, 1) - n = int(t) - if n: - break - - name = names[name] - if t > n: - return '%s%s' % (t, name) - else: - return '%s%s' % (n, name) - - -#***************************************************************** -# -#**************************************************************** -HEX_PREFIXES = ('0x', '0X', '&H', '&h') -NUM_DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz" - - -def to_base(to_base, num, base=10, hex_prefixes=HEX_PREFIXES): - """Converts a number to the desired base - @param to_base: base to convert the number to (2-36 and 256) - @param num: number to convert - @param base: base of the number to convert - @param hex_prefixes: prefixes for hexadecimal numbers to be recognized by the function - - @return: (str) converted number - - - >>> to_base(2, 10) - '1010' - >>> to_base(10, '1010', base=2) - '10' - >>> to_base(2, '1010', base=2) - '1010' - - >>> to_base(10, '0xFF', base=16) - '255' - - >>> to_base(256, '0x61', base=16) - 'a' - >>> to_base(2, 'a', base=256) - '1100001' - - - >>> result = to_base(2, 'Hello World!', 256) - >>> result - '10010000110010101101100011011000110111100100000010101110110111101110010011011000110010000100001' - >>> result = to_base(256, result, base=2) - >>> result - 'Hello World!' - - """ - if num < 0: - raise ValueError('negative numbers not supported: %r' % num) - if to_base < 2 or to_base > 36 and not to_base == 256: - raise ValueError('bes must be in range 2-36 or 256, found: %r' % to_base) - if base < 2 or base > 36 and not base == 256: - raise ValueError('bes must be in range 2-36 or 256, found: %r' % base) - - if base == 256: - tmp_num = 0 - for char in num: - tmp_num = (tmp_num << 8) + ord(char) - num = tmp_num - else: - # let int() handle it - if base == 16: - num = strip_hex_prefix(num, hex_prefixes=hex_prefixes) - num = int('%s' % num, base) - - if to_base == 10 and base != 256: - return str(num) - - out = '' - if to_base == 256: - while num: - num, tail = divmod(num, to_base) - out += chr(tail) - return out[-1::-1] if out else '\x00' - else: - while num: - num, tail = divmod(num, to_base) - out += NUM_DIGITS[tail] - return out[-1::-1] if out else '0' - - - -def strip_hex_prefix(num, hex_prefixes=HEX_PREFIXES): - """Strips prefixes from hexadecimal numbers - @param num: number to strip prefix from - @param hex_prefixes: list containing prefixes to strip - @return: (str) stripped number - - >>> strip_hex_prefix('0xFF') - 'FF' - >>> strip_hex_prefix('&HFF') - 'FF' - >>> strip_hex_prefix(10) - '10' - >>> strip_hex_prefix('') - '' - - """ - if not isinstance(num, basestring): - num = '%s' % num - else: - pat = re.compile( - '\A(%s)' % '|'.join([re.escape(i) for i in hex_prefixes]) - ) - num = pat.sub('', num) - return num - - -#***************************************************************** -# -#**************************************************************** -if __name__ == '__main__': - import doctest - doctest.testmod() - - - - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |