一對夫婦的意見都提到std::setfill('0')
和std::setw
。雖然這些是必要的,但它們不足以完成任務。例如,此代碼:
std::cout << std::setfill('0') << std::setw(7) << std::showpos << 0.012;
將生成:0+0.012
作爲其輸出。這顯然不是我們想要的。
我們需要添加std::internal
標誌來告訴流插入「內部填充」 - 即,填充應的符號和數字的休息,所以代碼之間插入這樣的:
std::cout << std::setfill('0') << std::setw(7) << std::internal << std::showpos << 0.012;
...產生我們想要的輸出:+00.012
。
另請注意,填充字符是「粘滯」的,所以如果您在使用std::setw
與數字和非數字類型之間交替使用,則您可能需要/每次都要更改它。否則,諸如std::cout << setw(12) << name;
之類的結果將產生如下結果:0000000Jerry
,這也是很少需要的。
爲了確保我們總是得到相同的一些地方,小數點後,我們還需要設置std::fixed
標誌,並與std::setprecision
指定的名額,如:
#include <iostream>
#include <iomanip>
#include <vector>
int main() {
std::vector<double> values { 0.1234, 1.234, 1.5555 };
for (auto d : values)
std::cout << std::internal << std::showpos << std::setw(9)
<< std::setprecision(3) << std::setfill('0') << d << "\n";
}
將會產生我相信希望輸出:
+0000.123
+0001.234
+0001.556
有一個情況下,你不會得到,雖然對齊結果是這樣的:如果你有一個數太大,無法在提供的字段,所有之前的地方decim點仍將被打印。例如,如果我們將1e10
添加到前面的代碼要打印的數字列表中,則會將其打印爲:+10000000000.000
,這顯然不會與其他對齊。
處理這個問題的一個顯而易見的方法就是忍受它,並且如果它經常出現足以關心的問題,請增大字段大小以容納更大的數字。
另一種可能性是使用固定的符號,只有數字低於某個閾值,並切換到(例如)科學記數法以獲取較大的數字。
至少在我的經驗中,這樣的代碼傾向於主要用於財務數據,在這種情況下後者通常是不可接受的。
請參閱:http://stackoverflow.com/questions/1714515/how-can-i-pad-an-int-with-leading-zeros-when-using-cout-operator – NathanOliver
使用std :: setfill(' 0')和std :: setw() – 911
我不認爲'setfilll'將在這種情況下工作。使用'0'作爲填充字符,他的第一個結果最終會像'00 + 0.0012'一樣,而不是所有數字前面的'+'。 –