# 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.

  """
  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])
