我需要将整数转换为Glib :: ustring,但我不想使用stringstream。并不是因为stringstream存在任何错误,但我不希望另一个库只是来完成这么简单的任务。
我的第一直觉是用一个大的'ol if语句编写一个函数,或者为每个数字使用一个字符数组,但必须有更清洁的东西。还有其他选择吗?
答案 0 :(得分:2)
Glib::ustring text = Glib::ustring::format(123456);
提供了一个format
静态函数,它只是将你抛出的任何内容(最多8个参数,似乎没有可变参数模板)转发到字符串流并返回格式化字符串:
Glib::ustring text(std::to_string(123456));
从c ++ 11开始,标准库也有一个重载to_string
方法来转换整数和浮点数
0=250
26000=0.86M
0=250|18000=300
0=250|18000=300|26000=0.86M
答案 1 :(得分:0)
编辑:此方法旨在完全避免STL,对于必要的案例/库。但是,无论如何,Glib :: ustring确实使用了STL,仅仅是FYI。如果您正在使用其他一些自定义字符串类,或者只是感觉像是一个带有Glib的智能aleck,这可能仍然会派上用场。
是的,它实际上是可能的,虽然它确实需要自定义功能。到目前为止,这非常有效,并且除了明显的Glib :: ustring之外不需要任何其他库。您可以替换任何其他支持char的字符串类,并相应地调整Glib :: ustring行。
Glib::ustring int_to_ustring(int num)
{
bool neg = false;
int sub = 0;
char digit;
//This is what we'll return.
Glib::ustring str = "";
//If number is 0, the math won't work. Just return the string "0".
if(num == 0)
{
str = "0";
return str;
}
//Else, if the number is negative...
else if(num < 0)
{
//Store that information and make the number positive.
neg = true;
num = abs(num);
}
//Determine place value.
int pv = 0;
do
{
//Divide by a power of ten and trunicate decimal.
sub = num / pow(10, pv);
//Increase pv.
pv++;
}
//If we got zero, then we're too large.
while(sub != 0);
//NOTE: The above seems to make the place value two-too-large?
//Loop backwards through the place values.
for(pv; pv >= 0; pv--)
{
sub = num / pow(10, pv);
num -= sub*(pow(10, pv));
if(sub < 0 || sub > 10)
{
//Throw an error. I'm just using this as a placeholder.
std::cout << "Something went really weird." << std::endl;
}
//The char code for the digit is always 48 more than the digit.
digit = sub + 48;
//If this isn't a leading zero...
if(!(str == "" && digit == '0'))
{
//This is the best way to push a char to a ustring.
str.insert(str.end(), digit);
}
}
//If that number was negative, insert the negative sign.
if(neg)
str.insert(str.begin(), '-');
return str;
}
(顺便说一句,建议的改进是受欢迎的!我希望能提高效率。)