【问题标题】:Error occuring while using put_money in c++ [closed]在 C++ 中使用 put_money 时发生错误 [关闭]
【发布时间】:2020-12-21 19:12:58
【问题描述】:

在了解有关标准库的更多信息时,我遇到了 put_money。 我的代码:

 std::cout.imbue(std::locale("en_US.UTF-8"));
    std::cout << std::left << std::showbase << std::setfill('*')
              << "flt: " << std::setw(15) << -9.87 << '\n'
              << "hex: " << std::setw(15) << 41 << '\n'
              << " $: " << std::setw(15) << std::put_money(367, false) << '\n'
              << "usd: " << std::setw(15) << std::put_money(367, true) << '\n'
              << "usd: " << std::setw(15)
              << std::setfill(' ') << std::put_money(367, false) << '\n';

但在编译此代码时,我收到一条错误消息:

C:\Users\tbhar\Documents\C++ codes>cd "c:\Users\tbhar\Documents\C++ codes\" && g++ codetester.cpp -Wall -Wextra -o codetester && "c:\Users\tbhar\Documents\C++ codes\"codetester
terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid   

使用以下功能时发生类似错误: std::put_moneystd::get_timestd::put_time。 我不知道为什么会收到此错误。

【问题讨论】:

标签: c++ c++-standard-library


【解决方案1】:

正如@Dietmar Kühl 评论的那样,这似乎是您的安装问题,只是缺少您要求它使用的语言环境。我添加了足够的东西让它编译得到:

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

int main() { 
    std::cout.imbue(std::locale("en_US.UTF-8"));
    std::cout << std::left << std::showbase << std::setfill('*')
              << "flt: " << std::setw(15) << -9.87 << '\n'
              << "hex: " << std::setw(15) << 41 << '\n'
              << " $: " << std::setw(15) << std::put_money(367, false) << '\n'
              << "usd: " << std::setw(15) << std::put_money(367, true) << '\n'
              << "usd: " << std::setw(15)
              << std::setfill(' ') << std::put_money(367, false) << '\n';
}

...当我运行它时,得到以下输出:

flt: -9.87**********
hex: 41*************
 $: $3.67**********
usd: USD *3.67******
usd: $3.67   

他建议使用“C”语言环境是合理的(保证存在),但通常会给出不同的结果,例如:

flt: -9.87**********
hex: 41*************
 $: 367************
usd: 367************
usd: 367            

您也可以尝试将保持无名的语言环境 (std::cout.imbue(std::locale(""));)。我相信这也保证存在,并且旨在选择配置操作系统的本机语言环境(但最终可能与“C”语言环境相同)。在这种情况下(在我的机器上)它会产生与 en_US 相同的结果,但如果您的供应商碰巧拼写不同的名称,"" 可能会在某些非空字符串失败时起作用。

在 Windows(使用 Microsoft VC++ 2019)上,它似乎也适用于我:

flt: -9.87**********
hex: 41*************
 $: $3.67**********
usd: USD3.67********
usd: $3.67

也许您正在使用 MinGW?做一个快速测试,它似乎只支持“C”语言环境。 "" 语言环境最终与 C 语言环境相同,并且我尝试使用的任何其他名称都会崩溃(尽管我收到的错误消息与您显示的略有不同)。

【讨论】:

  • 是的,我正在使用 MinGW,正如我在上面的 cmets 中所说,我的系统中存在 en-US,我不明白兄弟为什么我仍然遇到同样的错误
  • @TusharBharti:正如我所说,MinGW 似乎缺乏对“C”语言环境以外的任何支持。 VC++ 工作正常,但在同一个系统上,MinGW 完全失败(而且它的“”语言环境与其“C”语言环境相同这一事实是一个非常强烈的迹象,至少对我而言,不管系统的其余部分如何, it 仅支持“C”语言环境。
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
相关资源
最近更新 更多