/* * format: format a number * * symbols: * # = digit or space * 0 = digit or zero * ^ = exponential digit/format * . = decimal point * , = thousands * - = minus for negative * + = sign of number */ void format_num(char *dest, const char *fmt_cnst, var_num_t x) { char *p, *fmt; char left[64], right[64]; char lbuf[64], rbuf[64]; int dp = 0, lc = 0, sign = 0; int rsz, lsz; // backup of format fmt = tmp_alloc(strlen(fmt_cnst) + 1); strcpy(fmt, fmt_cnst); // check sign if (strchr(fmt, '-') || strchr(fmt, '+')) { sign = 1; if (x < 0.0) { sign = -1; x = -x; } } if (strchr(fmt_cnst, '^')) { // // E format // lc = fmt_cdig(fmt); if (lc < 4) { fmt_omap(dest, fmt); tmp_free(fmt); return; } // convert expfta(x, dest); // format p = strchr(dest, 'E'); if (p) { *p = '\0'; strcpy(left, dest); strcpy(right, p + 1); lsz = strlen(left); rsz = strlen(right) + 1; if (lc < rsz + 1) { fmt_omap(dest, fmt); tmp_free(fmt); return; } if (lc < lsz + rsz + 1) left[lc - rsz] = '\0'; strcpy(lbuf, left); strcat(lbuf, "E"); strcat(lbuf, right); fmt_nmap(-1, dest, fmt, lbuf); } else { strcpy(left, dest); fmt_nmap(-1, dest, fmt, left); } } else { // // normal format // // rounding p = strchr(fmt, '.'); if (p) { x = fround(x, fmt_cdig(p + 1)); } else { x = fround(x, 0); } // convert bestfta(x, dest); if (strchr(dest, 'E')) { fmt_omap(dest, fmt); tmp_free(fmt); return; } // left & right parts left[0] = right[0] = '\0'; p = strchr(dest, '.'); if (p) { *p = '\0'; strcpy(right, p + 1); } strcpy(left, dest); // map format rbuf[0] = lbuf[0] = '\0'; p = strchr(fmt, '.'); if (p) { dp = 1; *p = '\0'; fmt_nmap(1, rbuf, p + 1, right); } lc = fmt_cdig(fmt); if (lc < strlen(left)) { fmt_omap(dest, fmt_cnst); tmp_free(fmt); return; } fmt_nmap(-1, lbuf, fmt, left); strcpy(dest, lbuf); if (dp) { strcat(dest, "."); strcat(dest, rbuf); } } // sign in format if (sign) { // 24/6 Snoopy42 modifications char *e; e = strchr(dest, 'E'); if (e) { // special treatment for E format p = strchr(dest, '+'); if (p && p < e) { // the sign bust be before the E *p = (sign > 0) ? '+' : '-'; } p = strchr(dest, '-'); if (p && p < e) { *p = (sign > 0) ? ' ' : '-'; } } else { // no E format p = strchr(dest, '+'); if (p) { *p = (sign > 0) ? '+' : '-'; } p = strchr(dest, '-'); if (p) { *p = (sign > 0) ? ' ' : '-'; } } } // cleanup tmp_free(fmt); }
/** * double to string */ char *ftostr(var_num_t num, char *dest) { bestfta(num, dest); return dest; }