numpunctの補足

numpunctは規格の英文読み違えてました。
debug_numpunct::do_grouping()で64ビット整数用に20グループ分一桁の指定をしていましたが、
最後のグループより後ろは最後の指定に従うため、

std::string do_grouping() const // virtual
{
    return "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1";
}

でなく、

std::string do_grouping() const // virtual
{
    return "\1";
}

としておけばOKでした。
このぐらいの長さであれば、現在主流の短文字列最適化されたstringではコピーの負荷も少なくて済みますね。


ちなみにstd::numpunctでは、

std::string do_grouping() const // virtual
{
    return "";
}

で区切りなしの指定になっています。