Sprintf bug (?)

Hello all,

I am wondering if I have just found a bug in (s)printf...

According to the PickAxe, table "sprintf flag characters":

================= snip ==================================

0 (zero) all Pad with zeros, not spaces.

================= snip ==================================

so I think this call

irb(main):053:0> sprintf("%05s", 123)
=> " 123"

should correctly result in

"00123"

or I am getting something wrong?

thanks,
Peter

···

__
http://www.rubyrailways.com

Peter Szinek wrote:

Hello all,

I am wondering if I have just found a bug in (s)printf...

According to the PickAxe, table "sprintf flag characters":

================= snip ==================================

0 (zero) all Pad with zeros, not spaces.

================= snip ==================================

so I think this call

irb(main):053:0> sprintf("%05s", 123)
=> " 123"

should correctly result in

"00123"

or I am getting something wrong?

I think ruby follows the C standard, which says zero padding only applies to numeric formats.

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

sprintf("%05d",123) # 'd' not 's'
=> "00123"

···

----- Original Message ----- From: "Peter Szinek" <peter@rubyrailways.com>
To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Sent: Saturday, November 11, 2006 1:28 PM
Subject: sprintf bug (?)

Hello all,

I am wondering if I have just found a bug in (s)printf...

According to the PickAxe, table "sprintf flag characters":

================= snip ==================================

0 (zero) all Pad with zeros, not spaces.

================= snip ==================================

so I think this call

irb(main):053:0> sprintf("%05s", 123)
=> " 123"

should correctly result in

"00123"

Bernard Kenik wrote:

To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Sent: Saturday, November 11, 2006 1:28 PM
Subject: sprintf bug (?)

Hello all,

I am wondering if I have just found a bug in (s)printf...

According to the PickAxe, table "sprintf flag characters":

================= snip ==================================

0 (zero) all Pad with zeros, not spaces.

================= snip ==================================

so I think this call

irb(main):053:0> sprintf("%05s", 123)
=> " 123"

should correctly result in

"00123"

sprintf("%05d",123) # 'd' not 's'
=> "00123"

:slight_smile: I know 'd' is not 's', it was a bad example. It should have been

irb(main):002:0> sprintf("%10s",'hello')
=> " hello"

(there are no zeroes...)

Peter

···

----- Original Message ----- From: "Peter Szinek" <peter@rubyrailways.com>

__
http://www.rubyrailways.com

Peter Szinek wrote:

Bernard Kenik wrote:
  

To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Sent: Saturday, November 11, 2006 1:28 PM
Subject: sprintf bug (?)

Hello all,

I am wondering if I have just found a bug in (s)printf...

According to the PickAxe, table "sprintf flag characters":

================= snip ==================================

0 (zero) all Pad with zeros, not spaces.

================= snip ==================================

so I think this call

irb(main):053:0> sprintf("%05s", 123)
=> " 123"

should correctly result in

"00123"

sprintf("%05d",123) # 'd' not 's'
=> "00123"
    
:slight_smile: I know 'd' is not 's', it was a bad example. It should have been

irb(main):002:0> sprintf("%10s",'hello')
=> " hello"

(there are no zeroes...)

Peter
  
Possibly you meant "%010s" instead of "%10s"? In any case, I checked the output of a C program compiled with gcc on my Powerbook running OS X 10.8. In this case, the '0' flag adds padding on the left:

ruby$ cat testit.c
#include <stdio.h>

int main(int argc, char *argv)
{
        printf("%010s", "hello\n");
        return 0;
}

ruby$ ./testit
0000hello
ruby$

···

----- Original Message ----- From: "Peter Szinek" <peter@rubyrailways.com>

This is the correct behavior of sprintf for strings

···

----- Original Message ----- From: "Peter Szinek" <peter@rubyrailways.com>
To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Sent: Sunday, November 12, 2006 4:43 PM
Subject: Re: sprintf bug (?)

Bernard Kenik wrote:

----- Original Message ----- From: "Peter Szinek" <peter@rubyrailways.com>
To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Sent: Saturday, November 11, 2006 1:28 PM
Subject: sprintf bug (?)

Hello all,

I am wondering if I have just found a bug in (s)printf...

According to the PickAxe, table "sprintf flag characters":

================= snip ==================================

0 (zero) all Pad with zeros, not spaces.

================= snip ==================================

so I think this call

irb(main):053:0> sprintf("%05s", 123)
=> " 123"

should correctly result in

"00123"

sprintf("%05d",123) # 'd' not 's'
=> "00123"

:slight_smile: I know 'd' is not 's', it was a bad example. It should have been

irb(main):002:0> sprintf("%10s",'hello')
=> " hello"

(there are no zeroes...)

Peter

Hi,

Possibly you meant "%010s" instead of "%10s"? In any case, I checked the
output of a C program compiled with gcc on my Powerbook running OS X
10.8. In this case, the '0' flag adds padding on the left:

This is platform dependent. Linux manpage says:

       0 The value should be zero padded. For d, i, o, u, x, X,
              a, A, e, E, f, F, g, and G conversions, the converted
              value is padded on the left with zeros rather than
              blanks. If the 0 and - flags both appear, the 0 flag is
              ignored. If a precision is given with a numeric
              conversion (d, i, o, u, x, and X), the 0 flag is
              ignored. For other conversions, the behavior is

···

In message "Re: sprintf bug (?)" on Mon, 13 Nov 2006 07:03:44 +0900, Timothy Hunter <TimHunter@nc.rr.com> writes:
                                               ~~~~~~~~~~~~~~~
              undefined.
              ~~~~~~~~~

zero option affects some specifiers. %s is not among them.

              matz.

Yukihiro Matsumoto wrote:

zero option affects some specifiers. %s is not among them.

Thank, Matz. This made it really clear at last...

Peter

···

__
http://www.rubyrailways.com

I suggest that the OP asks ruby's description of sprintf via "ri sprintf" ... it is essentially as described above

···

----- Original Message ----- From: "Yukihiro Matsumoto" <matz@ruby-lang.org>
To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Sent: Sunday, November 12, 2006 6:34 PM
Subject: Re: sprintf bug (?)

Hi,

In message "Re: sprintf bug (?)" > on Mon, 13 Nov 2006 07:03:44 +0900, Timothy Hunter > <TimHunter@nc.rr.com> writes:

>Possibly you meant "%010s" instead of "%10s"? In any case, I checked the
>output of a C program compiled with gcc on my Powerbook running OS X
>10.8. In this case, the '0' flag adds padding on the left:

This is platform dependent. Linux manpage says:

      0 The value should be zero padded. For d, i, o, u, x, X,
             a, A, e, E, f, F, g, and G conversions, the converted
             value is padded on the left with zeros rather than
             blanks. If the 0 and - flags both appear, the 0 flag is
             ignored. If a precision is given with a numeric
             conversion (d, i, o, u, x, and X), the 0 flag is
             ignored. For other conversions, the behavior is
                                              ~~~~~~~~~~~~~~~
             undefined.
             ~~~~~~~~~

zero option affects some specifiers. %s is not among them.

matz.