By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,954 Members | 1,540 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,954 IT Pros & Developers. It's quick & easy.

%a format

P: n/a
Is there any reason python's printf-style formatting is missing the
(C99) '%a' specifier?

I'm sorry if this has been asked and answered before; I can't find it
on google ('%a' is a very awkward thing to look for):

--
John Lenton (jo**@grulic.org.ar) -- Random fortune:
Los cementerios estn llenos de valientes.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)

iD4DBQFBPf4FgPqu395ykGsRAundAJY6K3b3hoSl0Of1r6KYpH 4jYtYvAJ99KydK
2TNjiXJFj+rtikhRu0c9DA==
=T89S
-----END PGP SIGNATURE-----

Jul 18 '05 #1
Share this Question
Share on Google+
11 Replies


P: n/a
John Lenton <jo**@grulic.org.ar> writes:
Is there any reason python's printf-style formatting is missing the
(C99) '%a' specifier?


Because it's not very well known or used? A google for "C printf
format string" gave lots of resources, none of which had %a.

Java's JDK 1.5 java.util.Formatter class supports it, though.
Jul 18 '05 #2

P: n/a
Tor Iver Wilhelmsen wrote:
John Lenton <jo**@grulic.org.ar> writes:
Is there any reason python's printf-style formatting is missing the
(C99) '%a' specifier?


Because it's not very well known or used? A google for "C printf
format string" gave lots of resources, none of which had %a.


It's not C99, anyway; my copy of C99 makes no mention of it (the only
mention of %a is associated with gmtime.

--
__ Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/
/ \ San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
\__/ Education is a state-controlled manufactory of echoes.
-- Norman Douglas
Jul 18 '05 #3

P: n/a
On Tue, Sep 07, 2004 at 12:21:49PM -0700, Erik Max Francis wrote:
Tor Iver Wilhelmsen wrote:
John Lenton <jo**@grulic.org.ar> writes:
Is there any reason python's printf-style formatting is missing the
(C99) '%a' specifier?


Because it's not very well known or used? A google for "C printf
format string" gave lots of resources, none of which had %a.


It's not C99, anyway; my copy of C99 makes no mention of it (the only
mention of %a is associated with gmtime.


hmm! weird. From printf(3):

a,A (C99; not in SUSv2) For a conversion, the double
argument is converted to hexadecimal notation (using the
letters abcdef) in the style [‐]0xh.hhhhp±d; forA
conversion the prefix 0X, the letters ABCDEF, and the
exponent separator P is used. There is one hexadecimal
digit before the decimal point, and the number of digits
after it is equal to the precision. The default
precision suffices for an exact representation of the
value if an exact representation in base 2 exists and
otherwise is sufficiently large to distinguish values of
type double. The digit before the decimal point is
unspecified for non‐normalized numbers, and nonzero but
otherwise unspecified for normalized numbers.

and looking at ISO/IEC 9899:1999 (E), it's on page 278, §7.19.6.1:
a,A

A double argument representing a floating-point number is
converted in the style [-]0xh.hhhh p±d, where there is one
hexadecimal digit (which is nonzero if the argument is a
normalized floating-point number and is otherwise unspecified)
before the decimal-point character235) and the number of
hexadecimal digits after it is equal to the precision; if the
precision is missing and FLT_RADIX is a power of 2, then the
precision is sufficient for an exact representation of the value;
if the precision is missing and FLT_RADIX is not a power of 2,
then the precision is sufficient to distinguish236) values of type
double, except that trailing zeros may be omitted; if the
precision is zero and the # flag is not specified, no decimalpoint
character appears. The letters abcdef are used for a conversion
and the letters ABCDEF for A conversion. The A conversion
specifier produces a number with X and P instead of x and p. The
exponent always contains at least one digit, and only as many more
digits as necessary to represent the decimal exponent of 2. If the
value is zero, the exponent is zero.

A double argument representing an infinity or NaN is converted in
the style of an f or F conversion specifier.
--
John Lenton (jo**@grulic.org.ar) -- Random fortune:
It seems intuitively obvious to me, which means that it might be wrong.
-- Chris Torek

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)

iD8DBQFBPifjgPqu395ykGsRAiC9AKDHxzMZlIBagfhfd8x47M jMHQYjkwCeIeYY
Sb9juru++yV4/Oc0cAmyvus=
=DrCR
-----END PGP SIGNATURE-----

Jul 18 '05 #4

P: n/a
John Lenton wrote:
and looking at ISO/IEC 9899:1999 (E), it's on page 278, §7.19.6.1:


My bad, I did an incomplete search. Sorry about that.

--
__ Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/
/ \ San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
\__/ I always entertain great hopes.
-- Robert Frost
Jul 18 '05 #5

P: n/a
Tor Iver Wilhelmsen <to*****************@broadpark.no> wrote in message news:<us***********@broadpark.no>...
John Lenton <jo**@grulic.org.ar> writes:
Is there any reason python's printf-style formatting is missing the
(C99) '%a' specifier?


Because it's not very well known or used? A google for "C printf
format string" gave lots of resources, none of which had %a.


They do if you search for "C99" instead of just "C".

Anyhow, another reason for not supporting "%a" is that it would be
redundant. It would be sufficent to define an "%x" format for floats.
Jul 18 '05 #6

P: n/a
On Tue, Sep 07, 2004 at 04:48:25PM -0700, Dan Bishop wrote:
Tor Iver Wilhelmsen <to*****************@broadpark.no> wrote in message news:<us***********@broadpark.no>...
John Lenton <jo**@grulic.org.ar> writes:
Is there any reason python's printf-style formatting is missing the
(C99) '%a' specifier?


Because it's not very well known or used? A google for "C printf
format string" gave lots of resources, none of which had %a.


They do if you search for "C99" instead of just "C".

Anyhow, another reason for not supporting "%a" is that it would be
redundant. It would be sufficent to define an "%x" format for floats.


I don't think that's a good idea: no other specifier is dual
integer/float, and you'd break code that passes floats to a %x
expecting it to work as a %u, but in hex.

Actually the answer I was expecting was "FooOS doesn't support it" or
somesuch, not 'uhhh... el qu?' :) %a is very useful for what it was
created: serializing floats without loss of precision, and I was
surprised that python didn't support it.

--
John Lenton (jo**@grulic.org.ar) -- Random fortune:
De los parientes y el sol, entre ms lejos, mejor.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)

iD8DBQFBPlB0gPqu395ykGsRAkbNAJ9uBHuwo7xzm45LtGuFnI knTsl5bQCfdQO8
Xlr3B9uOJglR8D74sfTJt8I=
=/+Dw
-----END PGP SIGNATURE-----

Jul 18 '05 #7

P: n/a

"Tor Iver Wilhelmsen" <to*****************@broadpark.no> wrote in message
news:us***********@broadpark.no...
John Lenton <jo**@grulic.org.ar> writes:
Is there any reason python's printf-style formatting is missing the
(C99) '%a' specifier?


Because it's not very well known or used? A google for "C printf
format string" gave lots of resources, none of which had %a.

Java's JDK 1.5 java.util.Formatter class supports it, though.


I suspect there's no major reason more significant than that
no one has written the patch to support it. That might suggest
that no one really cares enough to do so - IIRC, Python
shifted from using the C library printf() function to its own
code some time ago, so there's no real commitment to
following the C standard in this instance.

If the OP wants it, I would suggest that he write the patch
(complete with the doc changes, etc.) and submit it. It might
be a good idea to provide a use case more significant than
"it's in the C99 standard" as well - but then I'm not
channeling the core developers that well these days.

John Roth
Jul 18 '05 #8

P: n/a
"John Roth" <ne********@jhrothjr.com> wrote in message news:<10*************@news.supernews.com>...
"Tor Iver Wilhelmsen" <to*****************@broadpark.no> wrote in message
news:us***********@broadpark.no...
John Lenton <jo**@grulic.org.ar> writes:
Is there any reason python's printf-style formatting is missing the
(C99) '%a' specifier?


Because it's not very well known or used? A google for "C printf
format string" gave lots of resources, none of which had %a.

Java's JDK 1.5 java.util.Formatter class supports it, though.


I suspect there's no major reason more significant than that
no one has written the patch to support it. That might suggest
that no one really cares enough to do so - IIRC, Python
shifted from using the C library printf() function to its own
code some time ago, so there's no real commitment to
following the C standard in this instance.

If the OP wants it, I would suggest that he write the patch
(complete with the doc changes, etc.) and submit it. It might
be a good idea to provide a use case more significant than
"it's in the C99 standard" as well - but then I'm not
channeling the core developers that well these days.


Why stick to just adding one conversion specifier to one data type?
Why not allow a programmer to define their own custom specifiers?

class Bits(int):
def __sprintf__(self, flags, precision, conversion):
if conversion == 'b':
# return a binary string
return itoa(self, 2) # Why isn't this a standard function?
else:
return NotImplemented
n = Bits(100)
# The % operator would call __sprintf__
print '%b' % n 1100100 # If it isn't implemented, use the current behavior as a default.
print '%d' % n

100

You'd be able to redefine the existing conversion too, in case you
want, for example, a high-precision numeric type to convert
'%.1000f'%x accurately.
Jul 18 '05 #9

P: n/a
> class Bits(int):
def __sprintf__(self, flags, precision, conversion):
if conversion == 'b':
# return a binary string
return itoa(self, 2) # Why isn't this a standard function?
else:
return NotImplemented


Well, I'm guessing itoa isn't a standard function because it's not that
commonly used... Not that I'm claiming to have written the widest variety of
Python code, but I've never needed it.

It is available though through a relatively short sequence of builtins though:
def itoa(i, base): .... return str(int(str(i), base))
.... itoa(100, 2)

'4'

A little roundabout, but it does do the trick.

Steve

Jul 18 '05 #10

P: n/a
I wrote:
def itoa(i, base):

... return str(int(str(i), base))
...


Oops. My bad. You wanted the inverse. Just ignore me. ;)

Jul 18 '05 #11

P: n/a
Steven Bethard wrote:
Well, I'm guessing itoa isn't a standard function because it's not
that
commonly used...


It was a common library add-on in the DOS world, but it was never
standard.

--
__ Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/
/ \ San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
\__/ Never had very much to say / Laugh last, laugh longest
-- Des'ree
Jul 18 '05 #12

This discussion thread is closed

Replies have been disabled for this discussion.