Re: printf() improvements

From: Date: Thu, 23 Apr 2020 06:29:57 +0000
Subject: Re: printf() improvements
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-109800@lists.php.net to get a copy of this message
On Wed, 22 Apr 2020 at 15:25, Nikita Popov <nikita.ppv@gmail.com> wrote: > Hi internals, > > I'd like to make two improvements to the printf() functionality exposed by > PHP (also affecting other variations like sprintf, vprintf, etc.) These > improvements are motivated by > https://wiki.php.net/rfc/locale_independent_float_to_string, > which will > make float to string casts locale insensitive, but not change the behavior > of printf() specifiers. > > The proposed improvements are: > > 1. Support for the %h and %H specifiers, which behave the same as %g and > %G, but are locale insensitive. These specifiers are already supported > internally in PHP (though %h goes by the name of %k for reasons that are > not relevant to userland) and is used for formatting floating-point numbers > where case-sensitivity is not desired, such as for var_export(). > > 2. Support for * width and precision, in which case the width/precision is > provided as an argument to printf(). This is a feature of printf() in C. > > The combination of these two features allows us to easily print floating > point numbers exactly as PHP would print them: > > // Locale-sensitive using precision ini setting. > sprintf("%.*G", ini_get('precision'), $float); > > // Locale-insensitive using serialize_precision ini setting. > sprintf("%.*H", ini_get('serialize_precision'), $float); > > Notably, this also supports precision -1 (the default serialize_precision), > which will pick the shortest accurate representation of the float. > > Without these features, it is actually quite hard to replicate PHP's exact > behavior. The best approximation I've found is to print with %G at multiple > precisions, pick out the shorted one and replace commas with dots on the > assumption that comma is the only locale-specific decimal separator. It > would be good to expose what PHP can already do directly. > > Implementations for the two features are available at > https://github.com/php/php-src/pull/5432 and > https://github.com/php/php-src/pull/5436. > > Regards, > Nikita > Seems like a no-brainer to add on my side. Best regards George P. Banyard

« previous php.internals (#109800) next »