2014-10-07 50 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