Un paio di commenti hanno menzionato std::setfill('0')
e std::setw
. Mentre questi sono necessari, non sono sufficienti per l'attività. Ad esempio, questo codice:
std::cout << std::setfill('0') << std::setw(7) << std::showpos << 0.012;
produrrà: 0+0.012
come uscita. Questo ovviamente non è esattamente quello che volevamo.
Abbiamo bisogno di aggiungere il flag std::internal
per indicare allo stream di inserire "padding interno" - ad es., L'imbottitura deve essere inserito tra il segno e il resto del numero, quindi il codice come questo:
std::cout << std::setfill('0') << std::setw(7) << std::internal << std::showpos << 0.012;
... produce l'uscita che vogliamo: +00.012
.
Si noti inoltre che il carattere di riempimento è "appiccicoso", quindi se si alterna l'utilizzo di std::setw
con tipi numerici e non numerici, sarà probabilmente necessario/si desidera cambiarlo ogni volta. In caso contrario, qualcosa come std::cout << setw(12) << name;
produrrà risultati come: 0000000Jerry
, che è raramente desiderato.
per assicurare che otteniamo sempre lo stesso numero di posti dopo la virgola, abbiamo anche bisogno di impostare il flag std::fixed
, e specificare il numero di posti con std::setprecision
, come ad esempio:
#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";
}
che produce l'uscita credo che si desidera:
+0000.123
+0001.234
+0001.556
C'è una circostanza in cui non sarà possibile ottenere risultati allineati in questo modo però: se si dispone di un numero troppo grande per entrare nel campo fornito, tutti i luoghi prima della decim al punto verrà comunque stampato. Ad esempio, se abbiamo aggiunto 1e10
all'elenco di numeri da stampare con il codice precedente, questo verrà stampato come: +10000000000.000
, che ovviamente non sarà allineato con il resto.
Il modo ovvio di affrontarlo sarebbe quello di sopportarlo e, se si presenta abbastanza spesso da preoccuparsi, aumentare le dimensioni del campo per accogliere i numeri più grandi.
Un'altra possibilità sarebbe quella di utilizzare la notazione fissa solo il numero è al di sotto di una certa soglia e passare alla notazione scientifica (per esempio) per numeri più grandi.
Almeno nella mia esperienza, il codice come questo tende ad essere utilizzato principalmente per dati finanziari, nel qual caso quest'ultima opzione di solito non è accettabile.
vedere: http://stackoverflow.com/questions/1714515/how-can-i-pad-an-int-with-leading-zeros-when-using-cout-operator – NathanOliver
use std :: setfill (' 0 ') e std :: setw() – 911
Non penso che 'setfilll' funzionerà in questo caso. Usando '0' come carattere di riempimento, il suo primo risultato finirebbe come' 00 + 0.0012', invece di '+' precedendo tutte le cifre come desiderato. –