Al Bowers wrote:

Jack Klein wrote: On Tue, 07 Oct 2003 01:48:13 GMT, "Christopher Robin"

I'm trying to find if a function exists that would format a

large (> 1000) number with comma notation on a unix type

system...

I currently have

X = 10000;

printf("X = %d\n", X);

which obviously only prints:

X = 10000

I'd like it if I could find a function that would format it

properly so it would print:

X = 10,000

Note that it doesn't really take a function, just a change in

the call to printf:

printf("X = %d,%d\n", X/1000, X%1000);

That would print: 10,0

ITYM printf("X = %d,%03d\n",X/1000, X%1000);

Now try that with X = 10. 0,010

Try the following. Compile with -DTESTING=1 to check it out, omit

that to create a linkable object module.

/* --- file putnums.c ---

Using binary as an example, code to ourput numbers

in a field, while injecting commas at intervals.

By C.B. Falconer. Put in public domain.

*/

#include <stdio.h>

#include "putnums.h"

#ifdef TESTING /* Add in a demonstration driver */

# include <limits.h>

# define BASE 10 /* Try 2 through 16 here only */

# define GROUP 3 /* with 0, 4 or 3 here */

#endif

/* ------------------- */

/* The original call must pass in depth == 0 */

/* field is zero based, so 36 allows 37 chars */

static int putval(FILE *fp, unsigned long v, int base,

int field, int clump, int neg,

int depth)

{

int retval;

static char hexchars[16] = "0123456789abcdef";

if (depth && clump && ((depth % clump) == 0)) field--;

if ((v / base) > 0) {

retval = 1 + putval(fp, v/base, base, field,

clump, neg, depth+1);

}

else {

if (neg) field--;

while (field > depth) {

putc(' ', fp);

field--;

}

if (neg) {

putc('-', fp);

retval = 2;

}

else retval = 1;

}

/* Revise this for base value larger than 16 */

putc((v % base)[hexchars], fp);

if (depth && clump && ((depth % clump) == 0)) {

putc(',', fp);

retval++;

}

return retval;

} /* putval */

/* ------------------- */

/* Negative field for left justification, 0 based */

/* clump is interval for group separator, 0 for none */

int putnum(FILE *fp, long v, int base,

int field, int clump)

{

int retval;

if (v < 0) retval = putval(fp, -v, base, field, clump, 1, 0);

else retval = putval(fp, v, base, field, clump, 0, 0);

while ((field + retval) <= 0) {

field++;

putc(' ', fp);

}

return retval;

} /* putnum */

/* ------------------- */

/* Negative field for left justification, 0 based */

/* clump is interval for group separator, 0 for none */

int putunum(FILE *fp, unsigned long v, int base,

int field, int clump)

{

int retval;

retval = putval(fp, v, base, field, clump, 0, 0);

while ((field + retval) <= 0) {

field++;

putc(' ', fp);

}

return retval;

} /* putunum */

/* ------------------- */

#ifdef TESTING

int main(void)

{

int i, lgh;

for (i = 0; i < 50; i++) putchar('0' + i % 10);

putchar('\n');

for (i = 0; i < 12; i++) {

lgh = putnum(stdout, i, BASE, 36, GROUP);

putchar(' ');

lgh = putnum(stdout, lgh, BASE, 8, GROUP);

puts(".");

}

i = INT_MAX - 4;

do {

i++;

lgh = putnum(stdout, i, BASE, 36, GROUP);

putchar(' ');

lgh = putnum(stdout, lgh, BASE, 8, GROUP);

puts(".");

} while (i < INT_MAX);

i = INT_MIN + 4;

do {

i--;

lgh = putnum(stdout, i, BASE, 36, GROUP);

putchar(' ');

lgh = putnum(stdout, lgh, BASE, 8, GROUP);

puts(".");

lgh = putunum(stdout, (unsigned long)i, BASE, 36, 0);

putchar(' ');

lgh = putnum(stdout, lgh, BASE, 8, GROUP);

puts(".");

} while (i > INT_MIN);

lgh = putunum(stdout, 1, BASE, -36, GROUP);

putchar(' ');

lgh = putunum(stdout, lgh, BASE, 8, GROUP);

puts(".");

for (i = 0; i < 4; i++) {

lgh = putudnum(stdout, (unsigned long)-i, 36, GROUP);

putchar(' ');

lgh = putdnum(stdout, lgh, 8, GROUP);

puts(".");

lgh = putunum(stdout, (unsigned long)-i, 16, 36, 4);

putchar(' ');

lgh = putunum(stdout, lgh, BASE, -8, GROUP);

puts(".");

lgh = putunum(stdout, (unsigned long)-i, 2, -36, 4);

putchar(' ');

lgh = putunum(stdout, lgh, BASE, 8, GROUP);

puts(".");

}

return 0;

} /* main */

#endif

/* --- end putnums.c --- */

/* --- file putnums.h --- */

#ifndef putnums_h_

# define putnums_h_

# ifdef __cplusplus

extern "C" {

# endif

/* Using binary as an example, code to ourput numbers

in a field, while injecting commas at intervals.

By C.B. Falconer. Put in public domain.

*/

/* ------------------- */

/* Negative field for left justification, 0 based */

/* clump is interval for group separator, 0 for none */

int putnum(FILE *fp, long v, int base,

int field, int clump);

/* ------------------- */

/* Negative field for left justification, 0 based */

/* clump is interval for group separator, 0 for none */

int putunum(FILE *fp, unsigned long v, int base,

int field, int clump);

/* Macros to ease use for decimal output */

#define putdnum(fp, v, field, clump) \

putnum(fp, v, 10, field, clump)

#define putudnum(fp, v, field, clump) \

putunum(fp, v, 10, field, clump)

# ifdef __cplusplus

}

# endif

#endif

/* --- end putnums.h --- */

--

Chuck F (cb********@yahoo.com) (cb********@worldnet.att.net)

Available for consulting/temporary embedded and systems.

<http://cbfalconer.home.att.net> USE worldnet address!