Browse Source

Improve numbers humanisation

tags/1.1.0
Vsevolod Stakhov 8 years ago
parent
commit
1eb05816d3
1 changed files with 12 additions and 13 deletions
  1. 12
    13
      src/libutil/printf.c

+ 12
- 13
src/libutil/printf.c View File

@@ -40,11 +40,10 @@ rspamd_humanize_number (gchar *buf, gchar *last, gint64 num, gboolean bytes)
const gchar *prefixes;
int i, r, remainder, sign;
gint64 divisor;
gsize baselen, len = last - buf;
gsize len = last - buf;

remainder = 0;

baselen = 1;
if (!bytes) {
divisor = 1000;
prefixes = "\0\0\0k\0\0M\0\0G\0\0T\0\0P\0\0E";
@@ -54,22 +53,14 @@ rspamd_humanize_number (gchar *buf, gchar *last, gint64 num, gboolean bytes)
prefixes = "B\0\0k\0\0M\0\0G\0\0T\0\0P\0\0E";
}


#define SCALE2PREFIX(scale) (&prefixes[(scale) * 3])

if (num < 0) {
sign = -1;
num = -num;
baselen += 2; /* sign, digit */
}
else {
sign = 1;
baselen += 1; /* digit */
}

/* Check if enough room for `x y' + suffix + `\0' */
if (len < baselen + 1) {
return buf;
}

/*
@@ -82,9 +73,17 @@ rspamd_humanize_number (gchar *buf, gchar *last, gint64 num, gboolean bytes)
num /= divisor;
}

r = rspamd_snprintf (buf, len, "%L%s",
sign * (num + (remainder + 50) / 1000),
SCALE2PREFIX (i));
if (remainder == 0 || num > divisor / 2) {
r = rspamd_snprintf (buf, len, "%L%s",
sign * (num + (remainder + 50) / divisor),
SCALE2PREFIX (i));
}
else {
/* Floating point version */
r = rspamd_snprintf (buf, len, "%.2f%s",
sign * (num + remainder / (gdouble)divisor),
SCALE2PREFIX (i));
}

#undef SCALE2PREFIX


Loading…
Cancel
Save