2011-02-17 65 views
6

如何使用自定义小数点和千位分隔符字符将数字(双精度)转换为字符串?Qt - 自定义小数点和千位分隔符

我见过QLocale,但我不想选择本地化国家,而是指定我自己的小数点和千位分隔符字符。

感谢

+0

我不禁问 - 为什么有必要使用自定义分隔符?你是否解析一个列表并被迫使用小数(或句号)作为分隔符? – spbots

+1

由于它是数学应用程序客户端需要选项来指定自定义小数点和千位分隔符字符。为什么这些不相关的问题...... –

回答

0

既然你不想QLocale也许你可以做一个简单的转换(与QString的::号码,例如),然后再把更换所需的字符。

0

很可怕的,但得到了这份工作做

double doubleNumber = 5234556.3545; 
int precision = 2; 

QString stringNumber = QString::number(doubleNumber, 'f', precision); 

for(int point = 0, i = (stringNumber.lastIndexOf('.') == -1 ? stringNumber.length() : stringNumber.lastIndexOf('.')); i > 0; --i, ++point) 
{ 
    if(point != 0 && point % 3 == 0) 
    { 
     stringNumber.insert(i, ','); 
    } 
} 
9

Qt不支持自定义语言环境。但是,面对的只有组和小数点字符很简单:

BTW,spbots'问题不无关系。有关目标的更多细节总是有所帮助,它可能会导致不同的方法,可能会更好地为您服务。

2

这里是你如何做到这一点只使用的std :: LIB(无QT)。定义您自己的numpunct派生类,它可以指定小数点,分组字符,甚至是分组之间的间距。使用包含您的方面的区域设置ostringstream。根据需要在该ostringstream上设置标志。输出到它并从中获取字符串。

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

class my_punct 
    : public std::numpunct<char> 
{ 
protected: 
    virtual char do_decimal_point() const {return ',';} 
    virtual char do_thousands_sep() const {return '.';} 
    virtual std::string do_grouping() const {return std::string("\2\3");} 
}; 

int main() 
{ 
    std::ostringstream os; 
    os.imbue(std::locale(os.getloc(), new my_punct)); 
    os.precision(2); 
    fixed(os); 
    double x = 123456789.12; 
    os << x; 
    std::string s = os.str(); 
    std::cout << s << '\n'; 
} 

1.234.567.89,12

1

为QML用户:

function thousandSeparator(input){ 
    return input.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"); 
} 
+0

尽管这段代码可能有助于解决问题,但 提供了关于_why_和/或_how_的其他上下文,回答这个问题将显着提高其长期价值。请[编辑]你的答案,添加一些 的解释。 –

+0

答案对我来说是完全适合的。谢谢! – rsp1984