это потому что ты смешал C с C++. SetLocale и sprintf это C. Соответственно настройки SetLocale влияют на sprintf. А stringstream это C++, там локаль задается через метод imbue
Точно. Оказалось, что в данном случае вообще не нужен принтф и можно записывать данные тем же стрингстримом, не смешивая разные либы.