printf padding with alternate character?

Discussion in 'C Programming' started by pb, Dec 14, 2004.

  1. pb

    pb Guest

    Im wanted to pad out blank spaces with a specific character instead of
    spaces or zeros, does C support that?

    printf("$%*d", '*', 5); // Not sure what the format string is supposed to
    look like to do this

    example output i would want is this:
    $********5
     
    pb, Dec 14, 2004
    #1
    1. Advertising

  2. pb

    Ben Pfaff Guest

    "pb" <> writes:

    > Im wanted to pad out blank spaces with a specific character instead of
    > spaces or zeros, does C support that?


    No. You will have to write your own code to do it.
    --
    Ben Pfaff
    email:
    web: http://benpfaff.org
     
    Ben Pfaff, Dec 15, 2004
    #2
    1. Advertising

  3. pb

    Chris Torek Guest

    In article <1103068973.18047@sj-nntpcache-3> pb <> wrote:
    >Im wanted to pad out blank spaces with a specific character instead of
    >spaces or zeros, does C support that?


    No.

    >printf("$%*d", '*', 5); // Not sure what the format string is supposed to
    >look like to do this


    (Note that //-comments wrap around, so that if this had been intended
    to be a code example, it would not have worked so well.

    The "*" in "%*d" is a field-width specifier that reads an "int"
    argument from the argument list, so:

    printf("%*d", 2, 5);

    prints the value "5" in a ten-character field. The field is blank
    or zero padded depending on the pad option selected: blank by
    default, zero if you use a 0 modifier.)

    >example output i would want is this:
    >$********5


    There is no standard way to do this. It is easy to build your own
    though: just sprintf() the numeric value, and then work with the
    string. In this case, to get an integer printed into a ten digit
    field and replace leading blanks or zeros with spaces, just do
    something like:

    char buf[SOME_SIZE]; /* must be at least 11 chars */
    int val;
    ...
    sprintf(buf, "%010d", val); /* produces, e.g., 0000000005 */
    subst(buf, '0', '*');

    where the subst() function reads:

    /*
    * Do substitutions on leading characters in the given string:
    * Replace all occurrences of "from" with "to". (We assume
    * from != '\0'.)
    */
    void subst(char *s, char from, char to) {
    while (*s == from)
    *s++ = to;
    }

    Note that if you print with leading blanks, you will need to subst()
    from ' ' instead of '0'. (This trick works either way.)
    --
    In-Real-Life: Chris Torek, Wind River Systems
    Salt Lake City, UT, USA (40°39.22'N, 111°50.29'W) +1 801 277 2603
    email: forget about it http://web.torek.net/torek/index.html
    Reading email is like searching for food in the garbage, thanks to spammers.
     
    Chris Torek, Dec 15, 2004
    #3
  4. pb wrote:
    > Im wanted to pad out blank spaces with a specific character instead

    of
    > spaces or zeros, does C support that?


    Yes, but not directly through a standard function.

    > printf("$%*d", '*', 5); // Not sure what the format string is

    supposed to
    > look like to do this
    >
    > example output i would want is this:
    > $********5


    #include <stdio.h>
    #include <string.h>

    #define HASH "*********"

    int main(void)
    {
    int amount = 520;
    char number[100];
    sprintf(number, "%d.%02d", amount / 100, amount % 100);
    printf( "$%.*s%s\n",
    (int) (sizeof HASH - 1 - strlen(number)),
    HASH,
    number );
    return 0;
    }

    BTW, $ is not a member of the basic character set.

    --
    Peter
     
    Peter Nilsson, Dec 15, 2004
    #4
  5. pb

    Mike Wahler Guest

    "pb" <> wrote in message
    news:1103068973.18047@sj-nntpcache-3...
    > Im wanted to pad out blank spaces with a specific character instead of
    > spaces or zeros, does C support that?
    >
    > printf("$%*d", '*', 5); // Not sure what the format string is supposed to
    > look like to do this
    >
    > example output i would want is this:
    > $********5


    You've got many good answers already. Here's another
    alternative:

    #include <iostream>
    #include <string>
    #include <stdio.h>

    unsigned int digits(int value, unsigned int radix)
    {
    unsigned int result = 0;

    if(value < 0)
    value *= -1;

    result = !value;

    while(value)
    {
    ++result;
    value /= radix;
    }

    return result;
    }

    int main()
    {
    int value = 42;
    int wid = 5;
    char prefix = '$';
    int leading = 0;
    char pad = '*';
    int i = 0;
    unsigned int d = digits(value, 10) + (value < 0);

    if(d > wid)
    wid = d;

    leading = wid - d ;

    putchar(prefix);

    for(i = 0; i < leading; ++i)
    putchar(pad);

    printf("%d\n", value);
    return 0;
    }

    -Mike
     
    Mike Wahler, Dec 15, 2004
    #5
  6. Mike Wahler wrote:

    > You've got many good answers already. Here's another
    > alternative:
    >
    > #include <iostream>
    > #include <string>
    > #include <stdio.h>


    Did you forget this was comp.lang.c? It's a good thing, since you might
    have gotten flamed in comp.lang.c++ for <stdio.h> instead of <cstdio>,
    or, in their anti-C exuberance, for using either.
     
    Martin Ambuhl, Dec 15, 2004
    #6
  7. pb

    Mike Wahler Guest

    "Martin Ambuhl" <> wrote in message
    news:...
    > Mike Wahler wrote:
    >
    > > You've got many good answers already. Here's another
    > > alternative:
    > >
    > > #include <iostream>
    > > #include <string>
    > > #include <stdio.h>

    >
    > Did you forget this was comp.lang.c?


    Actually, no. Those C++ headers are 'residue' from
    a 'scratch' file I forgot to delete. (I suppose they
    must have been scrolled off the screen.)

    > It's a good thing, since you might
    > have gotten flamed in comp.lang.c++ for <stdio.h> instead of <cstdio>,


    Any flames about that would be unjustified. <stdio.h>
    is as valid a standard header in C++ as in C. But yes,
    I know, some folks don't know any better.

    > or, in their anti-C exuberance, for using either.


    Let's not go there. :)

    But thanks for pointing out my error.
    I'll try to pay better attention in the future.

    -Mike
     
    Mike Wahler, Dec 15, 2004
    #7
  8. On Wed, 15 Dec 2004 00:37:38 +0000, Chris Torek wrote:

    ....

    > printf("%*d", 2, 5);
    >
    > prints the value "5" in a ten-character field.


    Looks like a 2 character field to me. :)

    > The field is blank
    > or zero padded depending on the pad option selected: blank by
    > default, zero if you use a 0 modifier.)
    >
    >>example output i would want is this:
    >>$********5

    >
    > There is no standard way to do this. It is easy to build your own
    > though: just sprintf() the numeric value, and then work with the
    > string. In this case, to get an integer printed into a ten digit
    > field and replace leading blanks or zeros with spaces, just do
    > something like:
    >
    > char buf[SOME_SIZE]; /* must be at least 11 chars */
    > int val;
    > ...
    > sprintf(buf, "%010d", val); /* produces, e.g., 0000000005 */
    > subst(buf, '0', '*');
    >
    > where the subst() function reads:
    >
    > /*
    > * Do substitutions on leading characters in the given string:
    > * Replace all occurrences of "from" with "to". (We assume
    > * from != '\0'.)
    > */
    > void subst(char *s, char from, char to) {
    > while (*s == from)
    > *s++ = to;
    > }
    >
    > Note that if you print with leading blanks, you will need to subst()
    > from ' ' instead of '0'. (This trick works either way.)


    That depends on whether you want 0 to be output as ********** or
    *********0

    Lawrence
     
    Lawrence Kirby, Dec 15, 2004
    #8
  9. pb

    Zoran Cutura Guest

    Chris Torek <> wrote:
    > In article <1103068973.18047@sj-nntpcache-3> pb <> wrote:

    ....
    > printf("%*d", 2, 5);

    ^^^
    10???
    >
    > prints the value "5" in a ten-character field. The field is blank

    ^^^
    two???
    --
    Z ()
    "LISP is worth learning for the profound enlightenment experience
    you will have when you finally get it; that experience will make you
    a better programmer for the rest of your days." -- Eric S. Raymond
     
    Zoran Cutura, Dec 15, 2004
    #9
  10. pb

    Chris Torek Guest

    >On Wed, 15 Dec 2004 00:37:38 +0000, Chris Torek wrote:
    >> printf("%*d", 2, 5);
    >> prints the value "5" in a ten-character field.


    In article <>
    Lawrence Kirby <> wrote:
    >Looks like a 2 character field to me. :)


    Oops. Hasty posting....

    >> Note that if you print with leading blanks, you will need to subst()
    >> from ' ' instead of '0'. (This trick works either way.)

    >
    >That depends on whether you want 0 to be output as ********** or
    >*********0


    Right, something else I managed to forget to bring up. And if this
    is intended for printing money-amounts, one may have to fiddle with
    negative numbers as more special cases.
    --
    In-Real-Life: Chris Torek, Wind River Systems
    Salt Lake City, UT, USA (40°39.22'N, 111°50.29'W) +1 801 277 2603
    email: forget about it http://web.torek.net/torek/index.html
    Reading email is like searching for food in the garbage, thanks to spammers.
     
    Chris Torek, Dec 15, 2004
    #10
  11. pb

    Mike Wahler Guest

    "Chris Torek" <> wrote in message
    news:...
    > >On Wed, 15 Dec 2004 00:37:38 +0000, Chris Torek wrote:
    > >> printf("%*d", 2, 5);
    > >> prints the value "5" in a ten-character field.

    >
    > In article <>
    > Lawrence Kirby <> wrote:
    > >Looks like a 2 character field to me. :)

    >
    > Oops. Hasty posting....


    I noticed it too, but realized it was merely a typo.
    I didn't want to 'pick on' someone whose contributions
    here I so highly value. :)

    > >> Note that if you print with leading blanks, you will need to subst()
    > >> from ' ' instead of '0'. (This trick works either way.)

    > >
    > >That depends on whether you want 0 to be output as ********** or
    > >*********0

    >
    > Right, something else I managed to forget to bring up. And if this
    > is intended for printing money-amounts, one may have to fiddle with
    > negative numbers as more special cases.


    While I did not test exhaustively, the example I posted allows
    for the '-' character for negative values.

    -Mike
     
    Mike Wahler, Dec 15, 2004
    #11
  12. pb

    Chris Torek Guest

    >"Chris Torek" <> wrote in message
    >news:...
    >> ... And if this
    >> is intended for printing money-amounts, one may have to fiddle with
    >> negative numbers as more special cases.


    In article <zk0wd.283$>
    Mike Wahler <> wrote:
    >While I did not test exhaustively, the example I posted allows
    >for the '-' character for negative values.


    Well, yes; but I was referring to accountants' desire to print
    negative numbers in parentheses, or with the minus sign at the
    end, or with a "CR" (credit) or "DB" (debit) suffix, e.g.:

    Your Bill

    item 1 $***123.45
    item 2 $****27.72 CR
    total $****95.73

    (I always thought these were obnoxious, myself. But my early
    training was all mathematics rather than accounting. :) )
    --
    In-Real-Life: Chris Torek, Wind River Systems
    Salt Lake City, UT, USA (40°39.22'N, 111°50.29'W) +1 801 277 2603
    email: forget about it http://web.torek.net/torek/index.html
    Reading email is like searching for food in the garbage, thanks to spammers.
     
    Chris Torek, Dec 15, 2004
    #12
  13. pb

    Mike Wahler Guest

    "Chris Torek" <> wrote in message
    news:...
    > >"Chris Torek" <> wrote in message
    > >news:...
    > >> ... And if this
    > >> is intended for printing money-amounts, one may have to fiddle with
    > >> negative numbers as more special cases.

    >
    > In article <zk0wd.283$>
    > Mike Wahler <> wrote:
    > >While I did not test exhaustively, the example I posted allows
    > >for the '-' character for negative values.

    >
    > Well, yes; but I was referring to accountants' desire to print
    > negative numbers in parentheses, or with the minus sign at the
    > end, or with a "CR" (credit) or "DB" (debit) suffix, e.g.:
    >
    > Your Bill
    >
    > item 1 $***123.45
    > item 2 $****27.72 CR
    > total $****95.73


    Oh, OK.

    >
    > (I always thought these were obnoxious, myself. But my early
    > training was all mathematics rather than accounting. :) )


    Well, I'm in the opposite 'camp'. All my early programming
    learning was in the context of business applications (my first
    HLL was COBOL :) ), and yes, I had to deal with the forms
    (value), valueCR, and value- as well. Since OP didn't give
    context, I 'defaulted' to the 'simpler' -value. I suppose
    the leading asterisks should have been a clue, though. :)

    Aside: One of the accounting oriented things I've done which
    I found fun was converting a number to English (e.g. 3125 to
    "Three thousand, one hundred twenty-five") for printing bank
    drafts. :)

    I do wish I'd learned more math, though. (I struggle with other
    than very simple graphics). I'm doing what I can to rectify that
    problem when I have time.

    Anyway, I'd like to take this opportunity to personally thank
    you for all your valuable contributions here. I feel I'm
    better with C because of you (and others here). :)

    -Mike
     
    Mike Wahler, Dec 15, 2004
    #13
  14. pb

    Guest

    Chris Torek <> wrote:
    >
    > Well, yes; but I was referring to accountants' desire to print
    > negative numbers in parentheses, or with the minus sign at the
    > end, or with a "CR" (credit) or "DB" (debit) suffix, e.g.:


    Or, even more obnoxiously, simply printing them in red, a practice which
    thankfully went out of fashion when monochrome copiers became prevalent.

    -Larry Jones

    I've got an idea for a sit-com called "Father Knows Zilch." -- Calvin
     
    , Dec 17, 2004
    #14
  15. pb

    totoquebec

    Joined:
    Feb 6, 2012
    Messages:
    2
    char line[20], tempNo[20];

    itoa( val, tempNo, 10 );
    sprintf( Line, "%8.8s", tempNo );
     
    totoquebec, Feb 6, 2012
    #15
  16. pb

    totoquebec

    Joined:
    Feb 6, 2012
    Messages:
    2
    more simple

    sprintf( Line, "8.8d" Val );
    for( i=0; Line == 0 ; i++ ) Line = '*';
     
    totoquebec, Feb 6, 2012
    #16
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Michal Prinke
    Replies:
    0
    Views:
    338
    Michal Prinke
    Oct 19, 2004
  2. Piotr B.
    Replies:
    2
    Views:
    516
    CBFalconer
    Oct 19, 2004
  3. Michal Prinke

    printf() formatting - stripping zeroes, padding

    Michal Prinke, Oct 19, 2004, in forum: C Programming
    Replies:
    0
    Views:
    337
    Michal Prinke
    Oct 19, 2004
  4. Chris
    Replies:
    2
    Views:
    701
    Chris
    Mar 4, 2007
  5. Replies:
    10
    Views:
    342
    Sean O'Halpin
    Jul 17, 2006
Loading...

Share This Page