$ printf "%f\n" 1.23 1.230000 $ LC_ALL=de_DE.UTF-8 printf "%f\n" 1.23 1.230000 $ env LC_ALL=de_DE.UTF-8 printf "%f\n" 1.23 1,230000here, we see that the internal bash printf doesn't respond to a 'local' setting of LC_ALL. Or maybe it doesn't respond to localization at all? Let's check:
$ LC_ALL=de_DE.UTF-8 bash -c 'printf "%f\n" 1.23' bash: Zeile 0: printf: 1.23: Ungültige Zahl. 0,000000 $ LC_ALL=de_DE.UTF-8 bash -c 'printf "%f\n" 1,23' 1,230000That output makes sense; intuitively, printf should both parse and print numbers according to the rules of de_DE. Unfortuantely,
$ LC_ALL=de_DE.UTF-8 bash -c 'env printf "%f\n" 1,23' printf: 1,23: Wert nicht vollständig konvertiert 1,000000 $ LC_ALL=de_DE.UTF-8 bash -c 'env printf "%f\n" 1.23' 1,230000the external printf (/usr/bin/printf) doesn't: it parses numbers according to the C locale and then prints them according to the user's locale. (The messages in German mean approximately 'Invalid number' and 'Value not completely converted')
Incidentally, it appears that /usr/bin/printf is in the right and bash's internal printf and my own intuition are in the wrong when it comes to parsing numeric arguments in locales other than C: an argument corresponding to %f "shall be evaluated as a C constant, as described by the ISO C standard" (Open Group Base Specifications)