使用点分隔符格式化浮点数

时间:2014-10-07 18:28:40

标签: c# csv locale

我正在编写一个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,有没有简单方法来解决这个问题?

2 个答案:

答案 0 :(得分: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

0.1是基数10,因此它可以精确地表示像float这样的小数货币值,float是基数2,它不能。使用float a = 3.6f, b = 0.1f, expected = 3.7f; float sum = a + b; Console.WriteLine(sum == expected); // false 将导致奇怪的舍入错误,并且比较将无法按预期工作。考虑一下:

3.69999981

这将输出false,因为sum实际上是{{1}}

您可以通过此C# in Depth excerpt了解有关此主题的更多信息。

答案 1 :(得分:-2)

你可以替换。像这样:

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