【问题标题】:No output when I use std::cout.imbue(std::locale("en_US.UTF-8")); in C++当我使用 std::cout.imbue(std::locale("en_US.UTF-8")); 时没有输出在 C++ 中
【发布时间】:2021-11-20 09:20:05
【问题描述】:

我试图让我的输出编号在超过 1,000 时具有标点符号。 我搜索了一些使用它的函数。

#include <iostream>
#include <limits>
#include <iomanip>

using namespace std;

struct numberPunctuations : numpunct<char> {
    string do_grouping() const {
        return "\03";
    }
};


int main()
{
    locale loc (cout.getloc(), new numberPunctuations);
    cout.imbue(loc);
    
    cout<<1000;

    return 0;
}

它可以工作,但我看到了一个较短的代码,但我无法让它工作。

#include <iostream>
#include <iomanip>
#include <locale>

using namespace std;



int main() 
{
    cout<<fixed<< setprecision(2); // decimal place

    // comma separator
    locale loc ("en_US.UTF-8");
    cout.imbue(loc);

    //cout.imbue(locale("en_US.UTF-8"));

    // test data
    cout<<123425 + 342346<<'\n';
    cout<<123.523456;

    return 0;
}

当我尝试运行它时,没有帖子(没有输出),但是当我使用 vim 和在线编译器 (OnlineGDB) 时,它可以工作。我喜欢第二个代码,因为它更短,有没有办法让它工作?

PS:我使用的IDE是clion(学生版)和VS code。

【问题讨论】:

  • 您在 Windows 上吗?语言环境std_name 只有几个标准化的名称(或者可能只有一个,C)。不幸的是,en_US.UTF-8 没有标准化。
  • 是的,我在 Windows 上,我试过 C.UTF-8 它也不起作用当我删除 UTF-8 时有输出但标点符号也不起作用
  • 在 Windows 上,区域设置只是 .UTF8,名称中没有 C。这是因为 C 语言环境始终是系统的 ANSI 代码页,因此它实际上是在请求某些内容,然后同时请求其他内容。
  • 您确定要对语言环境进行硬编码吗?不会选择用户的语言环境并进行设置吗?
  • @TedLyngmo 如果他们只是做了".UTF8",那将是带有用户语言环境的utf-8。

标签: c++ locale number-formatting punctuation numberformatter


【解决方案1】:

用户首选语言环境可以用一个空的语言环境名称来选择:

locale loc("");

在 Windows 上,命名区域名称可能类似于 "en-US""English_United States.1254"。如需更多信息,请参阅the documentation

【讨论】:

  • 他们仍然可以将 UTF-8 与用户的首选语言环境一起使用,只需将语言环境设置为 ".UTF8"
  • 好的,我试试谢谢 :D
  • 更新:运行测试数据时仍然没有帖子
  • @Mr.purp "en-US" 在我的电脑上工作得很好,输出以逗号作为千位分隔符,句点作为小数分隔符,这是美国的习惯。 “de-DE”按应有的方式切换它们。
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 2011-06-04
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
相关资源
最近更新 更多