Patrick Pinchera
2010-Nov-04 21:51 UTC
[dtrace-discuss] Some of my nanoseconds are missing....
Does anyone know if this was ever put into production code? I''d really like to make this work in some of my scripts: printf("%''d\n", 123000); should print out "123,000" if LC_ALL is set to something other than "C", say en_US.ISO8859-1. Right now it''s not. Solaris 10 10/09 prints out "123000" Solaris 11 Express b148 prints out "123000" The posting below from 2006 was the only entry n this subject that I could find. Thanks, Pat> Re: Some of my nanoseconds are missing... > Posted: Aug 8, 2006 2:11 PM in response to: Nik Clayton > > > Click to reply to this thread Reply > > > > I''m instrumenting Sendmail (as some of you are probably bored of > hearing). > > ... > > > > PS: Any chance D could grow a pragma to automatically insert commas in > > large numbers? It would make comparing results much easier. > > There is actually already a way to do this, but unfortunately it''s a bit > blocked behind a stupid bug/oversight. printf(3S) uses the quote ('') > character as a format flag that tells it to insert the locale''s thousands > grouping character for %i, %d, %u, %f, %F, %g, or %G. And this is actually > implemented by DTrace printf() as well. That is, this is legal D: > > printf("%''d\n", 123000); > > However, in order for the underlying printf to do anything with %'', the > locale subsystem has to be initialized by a call to setlocale(). And I > lazily forgot to put this into dtrace(1M), in part because my locale of > choice, POSIX C, maddeningly doesn''t implement the thousands separator, > and thus until that issue is fixed or worked-around, I can''t use it (!) > > So, if you want to fix this yourself temporarily, put this into > usr/src/cmd/dtrace/dtrace.c: > > #include <locale.h> > > setlocale(LC_NUMERIC, ""); > > and then do something like this: > > LC_NUMERIC=en_US dtrace <args ...> > > (or just have your default locale be a non-C locale, or set LC_ALL) and it > should work. We''ll get this fixed, although with the POSIX locale issue > still to be resolved. If you want to see if your locale supports a > grouping > character you can do this: > > $ LC_NUMERIC=en_US locale -k thousands_sep > thousands_sep="," > > $ LC_NUMERIC=C locale -k thousands_sep > thousands_sep="" > > Since you''re in the UK, I''m sure you''ve got the appropriate character > set as Her Majesty intended it to be :) > > -Mike > > -- > Mike Shapiro, Solaris Kernel Development. blogs.sun.com/mws/
Adam Leventhal
2010-Nov-08 18:17 UTC
[dtrace-discuss] Some of my nanoseconds are missing....
Hi Patrick, It looks like dtrace(1M) isn''t invoking setlocale(3C) to elicit the printf behavior you describe. This is a bug in DTrace. Adam On Thu, Nov 4, 2010 at 2:51 PM, Patrick Pinchera < patrick.pinchera at oracle.com> wrote:> Does anyone know if this was ever put into production code? I''d really > like to make this work in some of my scripts: > > printf("%''d\n", 123000); > > should print out "123,000" if LC_ALL is set to something other than "C", > say en_US.ISO8859-1. > > Right now it''s not. Solaris 10 10/09 prints out "123000" > > Solaris 11 Express b148 prints out "123000" > > The posting below from 2006 was the only entry n this subject that I could > find. > > Thanks, > Pat > > > Re: Some of my nanoseconds are missing... >> Posted: Aug 8, 2006 2:11 PM in response to: Nik Clayton >> >> Click to reply to this thread Reply >> >> >> > I''m instrumenting Sendmail (as some of you are probably bored of >> hearing). >> > ... >> > >> > PS: Any chance D could grow a pragma to automatically insert commas in >> > large numbers? It would make comparing results much easier. >> >> There is actually already a way to do this, but unfortunately it''s a bit >> blocked behind a stupid bug/oversight. printf(3S) uses the quote ('') >> character as a format flag that tells it to insert the locale''s thousands >> grouping character for %i, %d, %u, %f, %F, %g, or %G. And this is actually >> implemented by DTrace printf() as well. That is, this is legal D: >> >> printf("%''d\n", 123000); >> >> However, in order for the underlying printf to do anything with %'', the >> locale subsystem has to be initialized by a call to setlocale(). And I >> lazily forgot to put this into dtrace(1M), in part because my locale of >> choice, POSIX C, maddeningly doesn''t implement the thousands separator, >> and thus until that issue is fixed or worked-around, I can''t use it (!) >> >> So, if you want to fix this yourself temporarily, put this into >> usr/src/cmd/dtrace/dtrace.c: >> >> #include <locale.h> >> >> setlocale(LC_NUMERIC, ""); >> >> and then do something like this: >> >> LC_NUMERIC=en_US dtrace <args ...> >> >> (or just have your default locale be a non-C locale, or set LC_ALL) and it >> should work. We''ll get this fixed, although with the POSIX locale issue >> still to be resolved. If you want to see if your locale supports a >> grouping >> character you can do this: >> >> $ LC_NUMERIC=en_US locale -k thousands_sep >> thousands_sep="," >> >> $ LC_NUMERIC=C locale -k thousands_sep >> thousands_sep="" >> >> Since you''re in the UK, I''m sure you''ve got the appropriate character >> set as Her Majesty intended it to be :) >> >> -Mike >> >> -- >> Mike Shapiro, Solaris Kernel Development. blogs.sun.com/mws/ >> > _______________________________________________ > dtrace-discuss mailing list > dtrace-discuss at opensolaris.org >-- Adam Leventhal, Delphix http://dtrace.org/blogs/ahl -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.opensolaris.org/pipermail/dtrace-discuss/attachments/20101108/ca3fb473/attachment.html>