C# 使用点分隔符格式化浮点

C# 使用点分隔符格式化浮点,c#,csv,locale,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,

我正在编写一个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
属性是一个float,我的区域设置使用逗号作为十进制分隔符,这在CSV中显然是一个相当大的问题,因此它将输出10,50,而不是10.50,有什么简单的方法来解决这个问题吗

您可以用替换。像这样:

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

您可以指定使用
的固定区域性:

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.1
float
是以2为基数的,它不能。使用
float
将导致奇怪的舍入错误,比较将无法按预期进行。考虑这一点:

float a = 3.6f, b = 0.1f, expected = 3.7f;
float sum = a + b;
Console.WriteLine(sum == expected); // false
这将输出false,因为总和实际上是
3.69999981


你可以从这里读到更多关于这个主题的内容。

流出是一个浮点数而不是一个字符串,所以我不能这样做。转换怎么样?为什么用十进制表示货币?Saeb的回答是有效的,但是如果你选择保留逗号,那很好,因为CSV文件必须在包含嵌入引号的字段周围使用引号。见RFC 4180第2.6节。建议使用
Invariant
区域性,因为它表示一个常量(不变)区域性,恰好使用句点表示小数而不是逗号。