Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Print a number with comma delimited

Posted on 2006-07-02
Last Modified: 2012-06-27
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?
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);
    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;
    return buf;


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;
LVL 44

Expert Comment

ID: 17042128
There is an API function that will do that - 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

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.


Expert Comment

ID: 17042136
LVL 44

Expert Comment

ID: 17042169

Author Comment

ID: 17047787
hi, AndyAinscow,

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

Accepted Solution

AndyAinscow earned 500 total points
ID: 17048543
LVL 44

Expert Comment

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

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

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…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question