Re: [v][sf]printf additions (#, E, g, G)
| From: | Matt W | Date: | Sun, 23 Jul 2006 09:38:57 +0000 |
| Subject: | Re: [v][sf]printf additions (#, E, g, G) | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-24900@lists.php.net to get a copy of this message | ||
Hi Gwynne,
----- Original Message -----
From: "Gwynne"
Sent: Saturday, July 22, 2006
> On Jul 20, 2006, at 3:21 PM, Marcus Boerger wrote:
> >> I've wished there was a *printf() float specifier that wouldn't
> >> include
> >> trailing zeros/point, as simply converting to string (echo, %s,
> >> etc.) can
> >> result in scientific notation, which I *don't* want (%g in
> >> convert_to_string()). The only other way that would result in
> >> what I want
> >> is number_format() with my "no-extra-zeros option" patch. ;-) So
> >> I was
> >> originally looking for how to NOT pad %f to the specified
> >> precision, then I
> >> thought why not add more of the stuff from C? (And I see it's
> >> marked "not
> >> done" in formatted_print.c.)
> >
> >> Can/should I go ahead and add support for the # flag/specifier, g/
> >> G, and E
> >> (the missing compliment to e)? Make everything work like C,
> >> except # used
> >> with f/F, which would mean "remove trailing 0's/point" -- as C's
> >> behavior
> >> with # and f (add point even when precision=0?) can be done in
> >> PHP. (I
> >> assume C's is for when precision is specified with * + parameter?)
> > Having more conversion specifiers here won't hurt. If it can be done
> > in a way compatible to other languages especially like C it should be
> > done in that way. If PHP has already closed the way by choosing
> > opposite
> > defaults the opposite should everntually also work.
>
> While we're on the subject, one of my favorite personal patches to
> PHP is one that adds the %n specifier. The parameter to %n is a
> reference which recieves the total length of the string with all
> replacements so far. %n itself is replaced by nothing at all. You
> could do this with $n = strlen( $s = sprintf( blah blah blah ) ) +
> strlen( $s .= sprintf( the rest of the blah ) );, but it's a very
> nice shortcut if you need the replaced length in the middle of the
> conversion or for a situation like this (and the above doesn't work
> too well if you have positional params!):
>
> printf( "Some processing message with %s replacements...%n", 'some', &
> $n );
> // do some stuff here
> print str_repeat( ' ', $n ) . "\rSome status text here that doesn't
> worry about whether the replaced text was longer.";
>
> Here's the printf(3) manpage description for %n (MacOS X system, BSD
> manpage):
>
> n The number of characters written so far is stored into
> the inte-
> ger indicated by the int * (or variant) pointer
> argument. No
> argument is converted.
>
> Any chance of getting this into PHP? I can provide a patch.
>
> -- Gwynne, Daughter of the Code
> "This whole world is an asylum for the incurable."
I had thought about adding %n too, but didn't know what the reaction would
be or if it'd be used. (And the length thing would have to be changed
[later] for Unicode length or such, I assume?) Also, wasn't sure about the
internals code for the reference and writing to it, etc. :-)
Sounds fine to me though, if your patch can be applied.
If PHP gets these additions, it'll have all of C's except %p I guess. :-)
Matt