从 std::locale 的 numpunct 中删除分组

问题描述 投票:0回答:1

我没有成功地尝试从 std::locale 中删除分组(千位分隔符)。

我需要从操作系统中设置的区域设置(例如 sk_SK 区域设置)中删除它,但保留所有其他与区域设置相关的格式特征(小数分隔符等)。

我的一些尝试在下面的代码中。看起来像是将语言环境与 no_separator 结合起来,剥离所有 numpunct 特征并将它们全部重置回“C”语言环境,而不是仅修改 do_grouping 特征。

(Windows10、VS、SDK 10.0、MSVC v142)

#include <iostream>
#include <locale>
#include <sstream>

struct no_separator : std::numpunct<char>
{
    protected:
    virtual string_type do_grouping() const
    {
        return "\0";
    } // groups of 0 (disable)
};

int main()
{
    std::cout.precision(8);
    std::cout.width(12);

    std::cout << "Test \"C\": " << 1234.5678 << std::endl;      // OK - 1234.5678

    std::locale skSKLocale("sk_SK");

    std::cout.imbue(skSKLocale);
    std::cout << "Test skSK: " << 1234.5678 << std::endl;       // OK - 1 234,5678

    //std::locale::global(skSKLocale);
    std::locale localeNoThousandsSeparator = std::locale(skSKLocale, new no_separator());
    std::locale finishedLoc = skSKLocale.combine<std::numpunct<char>>(localeNoThousandsSeparator);

    std::cout.imbue(localeNoThousandsSeparator);
    std::cout << "Test localeNoThousandsSeparator: " << 1234.5678 << std::endl;     // BAD - expected 1234,5678, got 1234.5678
    std::cout.imbue(finishedLoc);
    std::cout << "Test finishedLoc: " << 1234.5678 << std::endl;    // BAD - expected 1234,5678, got 1234.5678
}

谢谢您的帮助。

c++ locale customization
1个回答
0
投票

您的方面不知道 sk 区域设置。它只是使用默认实现。您可能希望将自定义

numpunct
的所有其他方法转发到您正在修改的任何语言环境的相关方面,例如:

struct no_separator : std::numpunct<char>
{ 
    no_separator(std::locale& base_locale) : 
      np(std::use_facet< std::numpunct<char> >(base_locale)) {
    }

  protected:
    string_type do_grouping() const override { return ""; }
    char_type do_decimal_point() const override { return np.decimal_point(); }
    char_type do_thousands_sep() const override { return np.thousands_sep(); }
    string_type do_truename() const override { return np.truename(); }
    string_type do_falsename() const override { return np.truename(); }

    const std::numpunct<char> & np;
};
© www.soinside.com 2019 - 2024. All rights reserved.