On AIX 7.2, I'm seeing test failures of test-strtod1.sh test-strtold1.sh
The reason is that on this system, in a French locale, both "1,5" and "1.5" are parsed with return value 1.5. This is allowed by POSIX [1], which says "In other than the C or POSIX locale, additional locale-specific subject sequence forms may be accepted." Note that such a behaviour of strtod() does not fix all internationalization problems around number parsing. Namely, there is also the grouping delimiter. For example, in Germany, the number 20.000,45 is the same as 20000,45 So, while strtod("20.000") may return 20, a correct internationalized parsing of "20.000" MUST return 20000, not 20 ! [1] https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtod.html 2019-12-12 Bruno Haible <br...@clisp.org> strtod, strtold tests: Avoid test failure on AIX 7.2. * tests/test-strtod1.c (main): Allow implementations in which ',' and '.' both are radix characters. * tests/test-strtold1.c (main): Likewise. diff --git a/tests/test-strtod1.c b/tests/test-strtod1.c index 75200cc..26b96be 100644 --- a/tests/test-strtod1.c +++ b/tests/test-strtod1.c @@ -68,8 +68,10 @@ main (int argc, char *argv[]) double result; errno = 0; result = strtod (input, &ptr); - ASSERT (result == 1.0); - ASSERT (ptr == input + 1); + /* On AIX 7.2, in the French locale, '.' is recognized as an alternate + radix character. */ + ASSERT ((ptr == input + 1 && result == 1.0) + || (ptr == input + 3 && result == 1.5)); ASSERT (errno == 0); } { @@ -78,8 +80,10 @@ main (int argc, char *argv[]) double result; errno = 0; result = strtod (input, &ptr); - ASSERT (result == 123.0); - ASSERT (ptr == input + 3); + /* On AIX 7.2, in the French locale, '.' is recognized as an alternate + radix character. */ + ASSERT ((ptr == input + 3 && result == 123.0) + || (ptr == input + 7 && result > 123.45 && result < 123.46)); ASSERT (errno == 0); } { diff --git a/tests/test-strtold1.c b/tests/test-strtold1.c index 3a2f533..e58174b 100644 --- a/tests/test-strtold1.c +++ b/tests/test-strtold1.c @@ -68,8 +68,10 @@ main (int argc, char *argv[]) long double result; errno = 0; result = strtold (input, &ptr); - ASSERT (result == 1.0L); - ASSERT (ptr == input + 1); + /* On AIX 7.2, in the French locale, '.' is recognized as an alternate + radix character. */ + ASSERT ((ptr == input + 1 && result == 1.0L) + || (ptr == input + 3 && result == 1.5L)); ASSERT (errno == 0); } { @@ -78,8 +80,10 @@ main (int argc, char *argv[]) long double result; errno = 0; result = strtold (input, &ptr); - ASSERT (result == 123.0L); - ASSERT (ptr == input + 3); + /* On AIX 7.2, in the French locale, '.' is recognized as an alternate + radix character. */ + ASSERT ((ptr == input + 3 && result == 123.0L) + || (ptr == input + 7 && result > 123.45L && result < 123.46L)); ASSERT (errno == 0); } {