/* Illustration of incorrect grouping by glibc for the en_IN and te_IN locales. $ diff -u glibc uClibc --- glibc 2003-08-13 17:37:02.000000000 -0500 +++ uClibc 2003-08-13 17:37:00.000000000 -0500 @@ -1,10 +1,10 @@ locale: en_IN.UTF-8 grouping: 3 2 - n=13 buf="12,34,567,890" - n=13 wbuf="12,34,567,890" + n=14 buf="1,23,45,67,890" + n=14 wbuf="1,23,45,67,890" n=21 buf="1,23,45,67,890.000000" n=21 wbuf="1,23,45,67,890.000000" locale: te_IN.UTF-8 grouping: 2 3 - n=13 buf="123,456,78,90" - n=13 wbuf="123,456,78,90" + n=13 buf="12,345,678,90" + n=13 wbuf="12,345,678,90" n=20 buf="12,345,678,90.000000" n=20 wbuf="12,345,678,90.000000" */ #define _ISOC99_SOURCE #include #include #include #include #include int main(void) { int n; char *g; static const char *loc[] = { /* "C", */ /* "en_US.UTF-8", */ "en_IN.UTF-8", "te_IN.UTF-8", /* "de_DE.UTF-8", */ /* "fa_IR.UTF-8", */ NULL }; const char **pl; struct lconv *lc; #define NBUF 128 char buf[NBUF]; wchar_t wbuf[NBUF]; for ( pl=loc ; *pl ; pl++) { if (!setlocale(LC_ALL, *pl)) { wprintf(L"setlocale for %s failed!\n", *pl); return EXIT_FAILURE; } lc = localeconv(); wprintf(L"locale: %s grouping:", *pl); for (g = lc->grouping ; *g ; g++) { wprintf(L" %d", *g); } wprintf(L"\n"); n = snprintf(buf, NBUF, "%I'ld", 1234567890L); wprintf(L" n=%d buf=\"%s\"\n", n, buf); n = swprintf(wbuf, NBUF, L"%I'ld", 1234567890L); wprintf(L" n=%d wbuf=\"%ls\"\n", n, wbuf); n = snprintf(buf, NBUF, "%'f", 1234567890.); wprintf(L" n=%d buf=\"%s\"\n", n, buf); n = swprintf(wbuf, NBUF, L"%'f", 1234567890.); wprintf(L" n=%d wbuf=\"%ls\"\n", n, wbuf); } return EXIT_SUCCESS; }