function abbreviateNumber(num, precision, ustr, bytes) {
    var fixed        = num.toFixed(20),
        decimalPlace = fixed.search(/\./),
        numeralPlace = fixed.search(/[1-9]/),
        significant  = decimalPlace - numeralPlace,
        units, unit, mid, i, divisor;
    if (significant > 0) {
      significant -= 1;
    }
    units = commaSplit(ustr);
    if (units.length === 1) {
      units = ustr.split('');
    }
    mid = units.indexOf('|');
    if (mid === -1) {
      // Skipping the placeholder means the units should start from zero,
      // otherwise assume they end at zero.
      mid = units[0] === '_' ? 0 : units.length;
    }
    i = max(min(floor(significant / 3), units.length - mid - 1), -mid);
    unit = units[i + mid];
    while (unit === '_') {
      i += i < 0 ? -1 : 1;
      unit = units[i + mid];
    }
    if (unit === '|') {
      unit = '';
    }
    if (significant < -9) {
      precision = abs(significant) - 9;
    }
    divisor = bytes ? pow(2, 10 * i) : pow(10, i * 3);
    return numberFormat(withPrecision(num / divisor, precision || 0)) + unit;
  }
@method getOption(name)
@returns Mixed
@accessor
@short Gets an option used internally by Number.
@example

  Sugar.Number.getOption('thousands');

@param {string} name

**
@method setOption(name, value)
@accessor
@short Sets an option used internally by Number.
@extra If `value` is `null`, the default value will be restored.
@options

  decimal     A string used as the decimal marker by `format`, `abbr`,
              `metric`, and `bytes`. Default is `.`.

  thousands   A string used as the thousands marker by `format`, `abbr`,
              `metric`, and `bytes`. Default is `,`.


@example

  Sugar.Number.setOption('decimal', ',');
  Sugar.Number.setOption('thousands', ' ');

@signature setOption(options)
@param {NumberOptions} options
@param {string} name
@param {any} value
@option {string} decimal
@option {string} thousands

*