Thanks for those comments, I now understand better what is being returned.
It seems an easy work around for shell output with thousands separator may
not be possible.  Within sqlite3.c there are ~1000 lines of printf.c code
(added in 3.8.3) so it does seem to be a development matter.  printf
support for a thousands separator would be nice ... is there a place for
feature requests?

On Sat, Nov 21, 2015 at 4:04 PM, Scott Robison <scott at casaderobison.com>
wrote:

> On Sat, Nov 21, 2015 at 1:47 PM, Bruce Hohl <brucehohl at gmail.com> wrote:
>
> > (1) SQLite will not return output with a thousands separator as follows:
> >
> > sqlite> select printf("%15.2f",123456789.12789);
> >    123456789.13
> >
> > sqlite> select printf("%'15.2f",123456789.12789);
> > <no output>
> >
> >
> >
> --------------------------------------------------------------------------------
> > (2) C language printf("%'15.2f",x) honors ' in printf() for thousands
> > separator:
> >
>
> Some libraries support this as a non-standard extension, but it is not part
> of standard C. Thus it will not work uniformly everywhere. And since SQLite
> doesn't use printf directly, it won't work at all.
>
>
> >
> > vi comma1.c
> > #include <stdio.h>
> > #include <locale.h>
> > int main(void)
> > {
> >    printf("%'15.2f\n", 123456789.1234);
> >    setlocale(LC_ALL, "");
> >    printf("%'15.2f\n", 123456789.1234);
> >    return 0;
> > }
> >
> > $ gcc comma1.c -o comma1
> >
> > $ ./comma1
> >    123456789.12
> >  123,456,789.12
> >
> >
> >
> --------------------------------------------------------------------------------
> > (3) So I thought maybe a C extension to SQLite might honor the thousands
> > separator:
> >
> > Using the half.c extension example from
> > https://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions with
> > printf("%'12.2f",x) added:
> >
> > #include <stdio.h>
> > #include <locale.h>
> > #include <sqlite3ext.h>
> > SQLITE_EXTENSION_INIT1
> >
> > // The half() SQL function returns half of its input value.
> > static void halfFunc(
> >   sqlite3_context *context,
> >   int argc,
> >   sqlite3_value **argv
> > ){
> >   sqlite3_result_double(context,
> > printf("%'12.2f",0.5*sqlite3_value_double(argv[0])));
> > }
> >
> > // SQLite invokes this routine once when it loads the extension.
> > int sqlite3_extension_init(
> >   sqlite3 *db,
> >   char **pzErrMsg,
> >   const sqlite3_api_routines *pApi
> > ){
> >   SQLITE_EXTENSION_INIT2(pApi)
> >   sqlite3_create_function(db, "half", 1, SQLITE_ANY, 0, halfFunc, 0, 0);
> >   return 0;
> > }
> >
> >
> > $ gcc -shared -fPIC -I. -o half.so half.c
> > $ sqlite3
> > sqlite> select load_extension('./half.so');
> >
> > sqlite> select half(750000);
> >    375000.0012.0
> > sqlite> select half(7500000);
> >   3750000.0012.0
> > sqlite> select half(75000000);
> >  37500000.0012.0
> > sqlite> select half(750000000);
> > 375000000.0012.0
> > sqlite> select half(7500000000);
> > 3750000000.0013.0
> > sqlite> select half(75000000000);
> > 37500000000.0014.0
> >
> > Result:
> > (1) Output includes unwanted '12.0', '13.0', '14.0'.
> >     The 12, 13, 14 appear to be the number of characters printed.
> >     Not sure of the reason for the '.0'
> >
> > (2) No thousands separator as wanted by including ' in printf():
> >     printf("%'12.2f",0.5*sqlite3_value_double(argv[0]))
> >
> > I mostly use sqlite from the command line so it would really be nice to
> > have a thousands separator for more readable output.  Comments or
> > suggestions please.
> >
>
> The problem with the extension is that it is using printf, which displays
> the actual characters of the floating point value directly to stdout,
> completely bypassing SQLite. Then the return value of printf (the number of
> characters printed) is used as the value of sqlite3_result_double.
>
> Obviously the ' extension isn't being honored here either, maybe because
> the "C" locale is in use. Either way, it isn't doing what you expect.
>
> One way to go would be to extend the format capabilities of the SQLite
> version of the printf function (which has nothing in common with the
> standard C library printf function) to honor a thousands separator. I don't
> know if there would be any interest on the part of the SQLite team to
> implement something like that.
>
> --
> Scott Robison
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>

Reply via email to