如何使用std :: stringstream定制千位分隔符和十进制字符?

时间:2018-03-16 11:16:13

标签: c++ string stringstream

我有一个表示浮点数的字符串,例如" 1000.34"。我想对该字符串应用一些千位和小数分隔符规则,例如,它变成" 1,000.34"。

我尝试执行以下操作:

ss.imbue(std::locale(ss.getloc(), new mySeparator));

struct mySeparator : std::numpunct<char> {
    char do_decimal_point() const {
      return '.';
    }
    char do_thousands_sep() const {
      return ',';
    }
    std::string do_grouping() const {
      return "\000"; // Groups of 3
    }
  };

但只有当它是数字而不是字符串时才有效:

double number = 1000.34;
ss << number;

如果我拥有的是表示数字的字符串,我该怎么做呢?有替代方法吗?

1 个答案:

答案 0 :(得分:0)

不确定为什么需要使用std::stringstream,但是如果你只想操纵字符串,这是数字,并从小数点开始每隔3位数加,(如果没有小数点,则为数字的结尾)你可以只是:

#include <iostream> 
#include <string> 

int main()
{
    std::string num = "-4324234324.234";

    size_t i = num.rfind('.');
    if (i == num.npos) i = num.size();
    const size_t digits = 3 + (num.data()[0] == '-');
    while (i > digits) num.insert(i -= 3, 1, ',');

    std::cout << num << std::endl;
}

https://ideone.com/iRUYJz

-4,324,234,324.234