用点分隔符格式化浮点数

Ove*_*ive 1 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();
    }
Run Code Online (Sandbox Code Playgroud)

这一切都很好,我遇到的小问题是该Outflow属性是一个浮点数,并且我的语言环境使用逗号作为十进制分隔符,这在CSV 中显然是一个很大的问题,所以不是让我们说 10.50 它会输出 10,50,有什么简单的方法可以解决这个问题吗?

Sae*_*ini 5

您可以指定使用的不变文化.

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();
}
Run Code Online (Sandbox Code Playgroud)

在旁注中,decimal用于金钱而不是float

decimal以 10 为基数,因此它可以0.1精确地表示小数货币值,float以 2 为基数,但不能。使用float会导致奇怪的舍入错误,并且比较不会按预期进行。考虑一下:

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

这将输出 false 因为 sum 实际上是 3.69999981

您可以从深度摘录中的 C# 中阅读有关该主题的更多信息。