2014-10-07 51 views
1

我正在寫一個CSV格式轉換器,以交易爲文本文件轉換成CSV文件,我碰到一個小問題..格式浮球點分隔符

foreach (var transaction in transactions) 
    { 
     output.Append(
      string.Format("{0:dd/MM/yy},{1},{2},{3},{4:0.##},{5}", 
      transaction.Date, 
      transaction.Payee, 
      transaction.Category, 
      transaction.Memo, 
      transaction.Outflow, 
      transaction.Inflow)); 
     output.AppendLine(); 
    } 

這一切工作正常,在我遇到的一個小問題是,Outflow屬性是一個浮點數,我的語言環境使用逗號作爲小數點分隔符,這在CSV中顯然是一個問題,所以不是讓我們假設10.50它會輸出10,50,有沒有容易方式來解決這個?

+0

Saeb的回覆是有效的,但是如果您選擇離開逗號,那很好,因爲CSV文件必須在包含嵌入引號的字段周圍使用引號。請參閱RFC 4180的2.6節。http://tools.ietf.org/html/rfc4180 – 2014-10-07 18:58:48

+0

使用'不變'文化是推薦的方法,因爲它表示一個常數(不變)文化,恰好使用小數點而不是逗號。 – 2014-10-07 19:00:40

回答

-2

您可以替換,通過。像這樣:

transaction.Outflow.ToString().Replace(',','.'); 
+0

'流出'是一個浮動不是一個字符串,所以不,我不能這樣做。 – 2014-10-07 18:31:58

+0

如何轉換? – Moondustt 2014-10-07 18:34:00

4

可以指定使用.不變文化:

foreach (var transaction in transactions) 
{ 
    output.Append(
     string.Format("{0:dd/MM/yy},{1},{2},{3},{4},{5}", 
     transaction.Date, 
     transaction.Payee, 
     transaction.Category, 
     transaction.Memo, 
     transaction.Outflow.ToString("F2", CultureInfo.InvariantCulture), 
     transaction.Inflow)); 
    output.AppendLine(); 
} 

在一個側面說明,使用decimal錢不float

decimal是基地10,因此它可以代表分數貨幣值,如0.1float是基數2,它不能。使用float將導致奇怪的舍入錯誤,並且比較不會按預期工作。試想一下:

float a = 3.6f, b = 0.1f, expected = 3.7f; 
float sum = a + b; 
Console.WriteLine(sum == expected); // false 

這將輸出假的,因爲總和實際上是3.69999981

你可以從這個C# in Depth excerpt閱讀更多關於這個問題的。

+0

爲什麼要小數? – 2014-10-07 18:51:55

+0

@OverlyExcessive,用附加信息更新了答案。 – 2014-10-07 19:01:15