You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.0 KiB
97 lines
3.0 KiB
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
|
# Use of this source code is governed by a BSD-style license that can be |
|
# found in the LICENSE file. |
|
|
|
"""Various formatting functions.""" |
|
|
|
|
|
def NumToPercent(num, total, min_precision=1, max_precision=5): |
|
"""Returns the percentage (string) of |num| out of |total|. |
|
|
|
If the percentage includes a fraction, it will be computed down to the least |
|
precision that yields a non-zero and ranging between |min_precision| and |
|
|max_precision|. Values are always rounded down. All arithmetic operations |
|
are integer built-ins. Examples (using default precision): |
|
|
|
(1, 1) => 100% |
|
(3, 10) => 30% |
|
(3, 9) => 33.3% |
|
(3, 900) => 0.3% |
|
(3, 9000000) => 0.00003% |
|
(3, 900000000) => 0% |
|
(5, 2) => 250% |
|
|
|
Args: |
|
num: the value of the part |
|
total: the value of the whole |
|
min_precision: minimum precision for fractional percentage |
|
max_precision: maximum precision for fractional percentage |
|
Returns: |
|
Percentage string, or None if percent cannot be computed (i.e. total is |
|
zero). |
|
|
|
""" |
|
if total == 0: |
|
return None |
|
|
|
percent = 0 |
|
precision = min(min_precision, max_precision) |
|
factor = 10 ** precision |
|
while precision <= max_precision: |
|
percent = num * 100 * factor / total |
|
if percent: |
|
break |
|
factor *= 10 |
|
precision += 1 |
|
|
|
whole, frac = divmod(percent, factor) |
|
while frac and not frac % 10: |
|
frac /= 10 |
|
precision -= 1 |
|
|
|
return '%d%s%%' % (whole, '.%0*d' % (precision, frac) if frac else '') |
|
|
|
|
|
def BytesToHumanReadable(size, precision=1, decimal=False): |
|
"""Returns a human readable representation of a given |size|. |
|
|
|
The returned string includes unit notations in either binary (KiB, MiB, etc) |
|
or decimal (kB, MB, etc), based on the value of |decimal|. The chosen unit is |
|
the largest that yields a whole (or mixed) number. It may contain up to |
|
|precision| fractional digits. Values are always rounded down. Largest unit |
|
is an exabyte. All arithmetic operations are integer built-ins. Examples |
|
(using default precision and binary units): |
|
|
|
4096 => 4 KiB |
|
5000 => 4.8 KiB |
|
500000 => 488.2 KiB |
|
5000000 => 4.7 MiB |
|
|
|
Args: |
|
size: the size in bytes |
|
precision: the number of digits past the decimal point |
|
decimal: whether to compute/present decimal or binary units |
|
Returns: |
|
Readable size string, or None if no conversion is applicable (i.e. size is |
|
less than the smallest unit). |
|
|
|
""" |
|
constants = ( |
|
(('KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'), 1024), |
|
(('kB', 'MB', 'GB', 'TB', 'PB', 'EB'), 1000) |
|
) |
|
suffixes, base = constants[decimal] |
|
exp, magnitude = 0, 1 |
|
while exp < len(suffixes): |
|
next_magnitude = magnitude * base |
|
if size < next_magnitude: |
|
break |
|
exp += 1 |
|
magnitude = next_magnitude |
|
|
|
if exp != 0: |
|
whole = size / magnitude |
|
frac = (size % magnitude) * (10 ** precision) / magnitude |
|
while frac and not frac % 10: |
|
frac /= 10 |
|
return '%d%s %s' % (whole, '.%d' % frac if frac else '', suffixes[exp - 1])
|
|
|