2011-02-17 78 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