Solved

# Print a number with comma delimited

Posted on 2006-07-02
603 Views
I want to use printf to print out a number, say 4325932032, with comma delimited in thousands, that is, 4,325,932,032.

There is a way on an online faq telling us to use locale or a code snippet. We just wonder if there is a more reliable and convinient way to do so?
0
Question by:chcw

LVL 22

Expert Comment

ID: 17035682
following function accepts in form of long integer and returns comma delimited character array

const char * ConvertCD(long v)
{
static char   buf[16];
static char   buf2[16];
int           i;
int           j;
int           k;

if (v >= 0)
sprintf (buf, "%d", v);
else
sprintf (buf, "%d", -v);
if ((k = i = strlen (buf)) == 0)
return buf;
i = (i-1) / 3;
for (j = 0; j < i; j++)
{ sprintf (buf2, "%.*s,%s", k - 3*(j+1), buf, buf + k - 3*(j+1));
strcpy (buf, buf2);
}
if (v < 0)
{
sprintf (buf2, "-%s", buf);
return buf2;
}
else
return buf;
}

-MAHESH
0

LVL 5

Expert Comment

ID: 17041636
Hi there,

I would take the number apart by powers of ten, i.e. 10, 100, 1000
but only look at powers dividable by 3, i.e. 1,1000, 1000000, ...

const char *ConvertCD(long Num)
{
bool IsNeg = (Num < 0);
char strNum[32]={""};      //** stores the result
long p(1), Frac;            //** Frac stores one three digits fraction of number
char buf[4];            //** temp. buffer for _itoa()

Num = abs(Num);                           // work on positive values
strcat(strNum, Num < 0 ? "-": "+");   // prefix sign
while (p)
{
p      = 3*((int)log10(Num)/3);
Frac  =  Num/pow(10,p);                           // contains 3-digit number (* 10^9, 10^6, 10^3, 10^0)
Num -= Frac*pow(10,p);

strcat(strNum, _itoa(Frac, buf, 10));      // this is not ansi .. maybe use sprinf(buf, "%i,", Frac);
if (p>0) strcat(strNum, ",");
}
return strNum;
}
0

LVL 44

Expert Comment

ID: 17042128
There is an API function that will do that - GetNumberFormat

GetNumberFormat
The GetNumberFormat function formats a number string as a number string customized for a specified locale.

int GetNumberFormat(
LCID Locale,                // locale
DWORD dwFlags,              // options
LPCTSTR lpValue,            // input number string
CONST NUMBERFMT *lpFormat,  // formatting information
LPTSTR lpNumberStr,         // output buffer
int cchNumber               // size of output buffer
);

0

LVL 5

Expert Comment

ID: 17042136
*darn*
0

LVL 44

Expert Comment

ID: 17042169
;-)
0

LVL 8

Author Comment

ID: 17047787
hi, AndyAinscow,

Can you provide a sample of usage? I cannot find one in MSDN.
0

LVL 44

Accepted Solution

AndyAinscow earned 500 total points
ID: 17048543
0

LVL 44

Expert Comment

ID: 17208198
My suggestion uses a standard windows function to do what was requested.
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

### Suggested Solutions

The following diagram presents a diamond class hierarchy: As depicted, diamond inheritance denotes when two classes (e.g., CDerived1 and CDerived2), separately extending a common base class (e.g., CBase), are sub classed simultaneously by a fourt…
In Easy String Encryption Using CryptoAPI in C++ (http://www.experts-exchange.com/viewArticle.jsp?aid=1193) I described how to encrypt text and recommended that the encrypted text be stored as a series of hexadecimal digits -- because cyphertext may…
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…