On Thu, 30 Jan 2003, stormpunk wrote:

> I made one up real quick, I see no problems.
>
> --
>  >test commas
> 1:1
> 1200:1,200
> 10200:10,200
> -10200:-10,200
> 123123123:123,123,123
> 2123123123:2,123,123,123
> -2123123123:-2,123,123,123

Stormpunk, there's a small bug in your code with 3, 6, and 9 digit
negative numbers.
-100:-,100
-100000:-,100,000
-100000000:-,100,000,000



I was bored and decided to write my own functions to do this.

The first one does pretty much the same thing as stormpunk's:
let sprintf format the number, then stick commas in it.

The second one does all the number to string conversion itself,
adding in commas during the process.

These functions have the same usage as stormpunk's.

Who said this wasn't simple?  :)


Dennis



char * comma(long d, char * buf)
{
        char buf1[14];
        int len;
        int i = 0, j = 0;

        /* convert the number to a string */
        len = sprintf(buf1, "%ld", d);

        /* copy any leading - over */
        if (buf1[0] == '-')
        {
                buf[i++] = buf1[j++];
        }

        /* Copy the first digit */
        buf[i++] = buf1[j++];

        while (j < len)
        {
                /* insert a , if necessary */
                if (((len - j) % 3) == 0)
                        buf[i++] = ',';

                /* copy one digit */
                buf[i++] = buf1[j++];
        }

        /* NUL terminate the string */
        buf[i] = '\0';

        return buf;
}

char * comma(long d, char * buf)
{
        int i = 0;
        long base = 1000000000;
        int digits = 10;

        /* take care of negative numbers */
        if (d < 0)
        {
                buf[i++] = '-';
                d *= -1;
        }

        /* take care of 0 */
        if (d == 0)
                buf[i++] = '0';

        /* no leading 0's */
        while (base > d)
        {
                base = base / 10;
                digits--;
        }

        while (base >= 1)
        {
                /* Get one number */
                buf[i++] = d / base + '0';

                /* Update the variables */
                d %= base;
                base = base / 10;
                --digits;

                /* add in the , for thousands */
                if ((digits % 3) == 0 && digits > 0)
                        buf[i++] = ',';
        }

        /* NUL terminate the string */
        buf[i] = '\0';

        return buf;
}



Reply via email to