Robert Gamble wrote:

jc**********@gmail.com wrote:

Is there a format specification for printf that will result in:

1000000 being printed as 1,000,000? Or 1000000.0 as 1,000,000.0?

See Question 12.11 on the FAQ, it was posted today and can be found

at http://www.eskimo.com/~scs/C-faq/top.html.

You may also use my coding:

#ifndef putnums_h_ /* --- file 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. 2003-02-15

*/

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

/* 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 --- */

/* --- 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. 2003-02-15

*/

#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 --- */

--

"I conclude that there are two ways of constructing a software

design: One way is to make it so simple that there are obviously

no deficiencies and the other way is to make it so complicated

that there are no obvious deficiencies." -- C. A. R. Hoare