Cześć,
temat kręci wokół tego, że od czasu do czasu potrzeba wypisać liczby z różnymi separatorami. Poszukałem trochę na stacku, trochę w literaturze i napisałem coś takiego:
class separators : public std::numpunct<char>
{
public:
explicit separators(size_t r = 0) : std::numpunct<char>(r) {}
std::string thousands_sep;
std::string decimal_sep;
protected:
char do_thousands_sep() const final
{
return *thousands_sep.c_str();
}
std::string do_grouping() const final
{
if (thousands_sep.empty()) { return "\0"; }
else { return "\3"; }
}
char do_decimal_point() const final
{
return *decimal_sep.c_str();
}
};
potem w praktyce używam jej w tej sposób:
separators * s = new separators;
TCHAR szSep[8];
std::stringstream ss;
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, szSep, 8);
s->thousands_sep = szSep;
// ... tutaj po drodze jakaś matematyka dla wyniku
ss.imbue(std::locale(std::locale(), s));
ss << std::fixed << math_result;
if (ss.good())
{
//... jak wszystko jest ok, to zapisz ten wynik w formie tekstowej
}
Teraz problem z jakim się borykam:
Kiedy zbuduję wszystko w release jest w porządku, natomiast kiedy chcę przeprowadzić debugowanie, to dochodząc do if (ss.good())
dostaję błąd _CrtIsValidHeapPointer(block)
W projekcie jest trochę MFC, trochę boosta, no i STL. Nie mogę ustalić jaki jest powód takiego zachowania. Być może czegoś nie doczytałem i tak teraz się nie robi, a może czegoś brakuje, chociaż kod robi robotę i wyrzuca liczby tak sformatowane jak się tego oczekuje. Projekt jest z Visual Studio 2017 (v141), standard dopuszczalny C++14