2017-02-19 89 views
2

我需要打印一個帶有數字的cvs文件。 打印文件時,我有帶點的數字,但我需要用逗號。C++如何在文件中用逗號(而不是點)打印一個雙精度的十進制數字

這裏是一個例子。 如果我使用語言環境方法在終端打印此號碼,我獲得一個逗號的數字,但在文件中我有相同的號碼,但點。我不懂爲什麼。 我該怎麼辦?

#include <iostream> 
#include <locale> 
#include <string>  // std::string, std::to_string 
#include <fstream> 
using namespace std; 
int main() 
{ 
    double x = 2.87; 
    std::setlocale(LC_NUMERIC, "de_DE"); 
    std::cout.imbue(std::locale("")); 
    std::cout << x << std::endl; 
    ofstream outputfile ("out.csv"); 
    if (outputfile.is_open()) 
     { 
      outputfile <<to_string(x)<<"\n\n"; 
     } 
    return 0; 
} 

在此先感謝。

+2

灌輸物流對象,而不是cout。 –

+0

@尼爾[似乎沒有幫助](http://coliru.stacked-crooked.com/a/2947e8488c8fb6a2)。 –

+0

請注意,您需要爲'std :: setlocale'包含''。它可能在沒有頭文件的情況下工作,但不能保證(例如,如果沒有Visual C++,它不會編譯)。 –

回答

0

區域設置是系統特定的。你可能只是犯了一個錯字;嘗試"de-DE",這可能會工作(至少它在我的Windows上)。


然而,如果你的程序是不是天生的德國爲中心,然後濫用德語區域只是爲了得到一個特定的小數點字符的副作用是不好的編程風格,我想。

下面是使用std::numpunct::do_decimal_point的替代解決方案:

#include <string> 
#include <fstream> 
#include <locale> 

struct Comma final : std::numpunct<char> 
{ 
    char do_decimal_point() const override { return ','; } 
}; 

int main() 
{ 
    std::ofstream os("out.csv"); 
    os.imbue(std::locale(std::locale::classic(), new Comma)); 
    double d = 2.87; 
    os << d << '\n'; // prints 2,87 into the file 
} 

此代碼具體說,它只是想標準C++與僅','取代了小數點的字符格式。它沒有提及具體的國家或語言,或與系統相關的屬性。

2

你的問題是,std::to_string()使用C語言環境庫。看來"de_DE"在您的機器(或Coliru)上不是有效的語言環境,導致默認的C語言環境正在使用並使用.。解決方案是使用"de_DE.UTF-8"。另外,使用""代替std::locale不會總是產生逗號;相反,它將取決於爲您的機器設置的區域設置。

+0

[有趣!](http://coliru.stacked-crooked.com/a/1fe5711da15e03f1) –

+0

更確切地說,'std :: to_string'被定義爲以'sprintf' ,'sprintf'使用C語言環境庫。 –

相關問題