2012-10-04 27 views
5

在C中,一個空格可以包含在printf格式標記中,這會導致正數以空格爲前綴。這是對齊有符號值的有用功能。我無法弄清楚如何在C++中做同樣的事情。在C:ostream:在空格前面加上一個正數

double d = 1.2; 
printf("%f\n",d); 
printf("%+f\n",d); 
printf("% f\n",d); 

生產:

1.2 
+1.2 
1.2 

使用ostream的,我可以做前兩個,但我該怎麼做第三?

int d = 1.2; 
std::cout << d << std::endl; 
std::cout << std::showpos << d << std::endl; 
// ?????????????? 

編輯:似乎有大約是否我只想前綴的所有我值與空間的一些混亂。我只想以的正數值爲空格,類似於a),就像printf空間標誌所做的那樣,b)類似於showpos所做的,除了空格而不是「+」。例如:

printf("%f\n", 1.2); 
printf("%f\n", -1.2); 
printf("% f\n", 1.2); 
printf("% f\n", -1.2); 

1.2 
-1.2 
1.2 
-1.2 

請注意,第三個值以空格爲前綴,而第四個(負)值爲非前綴。

+0

你只是想打印空間? std :: cout <<「」; – Jeff

+0

如果您需要對齊數字,通常需要使用固定的精度和特定的字段寬度。如果你這樣做,那麼你也可以根據需要在開始時獲得額外的空間。 –

回答

1
std::cout << " " << my_value; 

如果您需要的空間只爲陽性:

if (my_value >=0) cout << " "; cout << my_value; 
+0

如果'my_value'爲負,那麼這樣做不會正確。如果值爲正值,我只需要一個空格,使負值和正值對齊(類似於std :: Showpos所做的,除了空格而不是'+')。 –

2

如何

std::cout << (d >= 0 ? " ":"") << d << std::endl; 
6

您可以使用setfillsetw,像這樣:

cout << setw(4) << setfill(' ') << 1.2 << endl; 
cout << setw(4) << setfill(' ') << -1.2 << endl; 

氏小號輸出如下:

1.2 
-1.2 

不要忘了包括<iomanip>爲了這個編譯(link to ideone)。

+0

只有兩個數字具有相同的精確度纔有效。如果值爲1.2和-1.0,則不起作用。 –

+0

你可以使用'std :: showpoint'來強制'-1.0'打印爲-1.0而不是'-1'。 – Zoneur

+0

如果值是1.22和-1.2? –

0

我沒有我與我的標準,我做這個東西太少,是信心的是:有兩種成分與輸入輸出流實現這一目標:

  1. 使用std:: showpos有一個指標顯示正值。當然,默認情況下這將使用+
  2. I 認爲+使用std::use_facet<std::ctype<char> >(s.get_loc()).widen('+')獲得。要將其轉變爲空間,您可以使用std::locale,並在安裝std::ctype<char>方面時使用空格來響應請求加寬+

也就是說,這樣的事情:

struct my_ctype: std::ctype<char> { 
    char do_widen(char c) const { 
     return c == '+'? ' ': this->std::ctype<char>::do_widen(c); 
    } 
}; 

int main() { 
    std::locale loc(std::locale(), new my_ctype); 
    std::cout.imbue(loc); 
    std::cout << std::showpos << 12.34 << '\n'; 
} 

(代碼不進行測試,並與可能的錯誤百病)。