2012-01-20 132 views
0

我有應該返回一個格式化的字符串的函數(HH:MM:sec.xxx) 我想要的輸出以顯示秒小時2米的地方,2個場所分鐘,5個地方(截斷的微秒);stringsteam格式語法

我的代碼:

#include <iostream> 
#include <iomanip> 

std::string getTime(uint64_t time){ //input is in microseconds 

unit64_t tempTime = time; 
unit64_t hours = (tempTime/3600000000); 
tempTime -= (hours * 3600000000); 

unit64_t mins = (tempTime/60000000); 
tempTime -= (mins * 60000000); 

double secs = ((double)tempTime/1000000); 

std::string strTime; 

stringstream ss; 
ss << std::setprecision(2)<<hours<<":" 
    << std::setprecision(2)<<mins <<":" 
    << std::setprecision(2)<<std::setprecision(2)<<secs; 

strTime = ss.str(); 
return strTime; 

} 

可能有人請告訴我正確的語法用於輸入值SS。它編譯和工作,但我沒有得到我想要的格式。

我剛纔所以如果你看到錯別字請見諒

回答

2

你忘了分鐘,你可能想0的小數精度輸入這個彌補了這一問題。嘗試:

ss << std::setw(2) << std::setfill('0') << std::setprecision(0) << hours << ":" 
    << mins << ":" 
    << std::setprecision(3) << secs; 
+0

謝謝。如何設置2小時和2分鐘的固定空間? – Miek

+0

@Miek:更新了答案。 – 2012-01-20 04:09:39

+0

你根本不需要'setprecision';它對積分類型沒有影響。與其他操縱器不同,'std :: setw'的效果隻影響下一個輸出;他們不粘。所以你必須爲每個元素重複它。 (再一次,一個不正確的答案會得到加分票,並被接受。) –

1

爲了您的整數字段,你可以使用std::setw(2)字段寬度和std::setfill('0')設置爲左零墊。

+0

非常感謝 – Miek

0

由於某種奇怪的原因,precision對整數類型 iostream沒有影響。 (這是標準的,但奇怪的是—許多 ostream格式是基於printf,精密影響 輸出積分值存在。)

答案顯然是定義操縱它你想要做什麼。 東西沿着線:

std::ostream& 
timeElement(std::ostream& stream) 
{ 
    stream.width(2); 
    stream.fill('0'); 
    return stream; 
} 

然後你可以寫:

ss << timeElement << hours << ':' 
    << timeElement << minutes << ':' 
    << timeElement << seconds; 

作爲一般規則,你很少使用標準的機械手。他們 應該被視爲比其他任何事情更多的例子。但他們 代表物理標記,我們幾乎總是想要的是邏輯 標記。

另外,不要忘了,當你這樣做的格式化標誌恢復到原來的狀態 。 (我從我的一個基類 類派生出所有的操作符,爲我處理這個問題,恢復它的 析構函數中的值。在這裏使用一個類將意味着你必須編寫 timeElement(),而不僅僅是timeElement;機械手 需要一個說法,沒有區別)

最後:時間和日期是特殊情況,我想實際使用 strftime他們。 (但我經常使用上述技術,僅需 就可以了。)