On Wed, 22 Apr 2020 at 15:25, Nikita Popov <nikita....@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