我试图使用CSVHelper库将数据写入MemoryStream,然后使用该MemoryStream生成CSV文件.

问题是,当双精度值有小数点时,双精度值会被转换成奇怪的字符串值.预期输出和奇怪输出位于底部.

有人知道如何克服这个问题吗?或者下面的代码有错误吗?

public class Foo
{
    public Foo()
    {
    }

    public double valOne { get; set; }

    public double valTwo { get; set; }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.valOne).Index(0).Name("Val One");
        Map(m => m.valTwo).Index(1).Name("Val Two");
    }
}

var records = new List<Foo> {
    new Foo{valOne = 3224.12, valTwo = 4122},
    new Foo{valOne = 2030.20, valTwo = 5555},
};

var config = new CsvConfiguration(CultureInfo.CurrentCulture) { Delimiter = ",", HasHeaderRecord = true };

using (var memoryStream = new MemoryStream())
using (var writer = new StreamWriter(memoryStream))
using (var csv = new CsvWriter(writer, config))
{
    csv.Context.RegisterClassMap<FooMap>();

    csv.WriteHeader<Foo>();

    csv.NextRecord();
    foreach (var record in records)
    {
        csv.WriteRecord(record);
        csv.NextRecord();
    }

    writer.Flush();
    
    var result = Encoding.UTF8.GetString(memoryStream.ToArray());

    byte[] bytes = Encoding.ASCII.GetBytes(result);

    return new FileContentResult(bytes, "text/csv")
    {
        FileDownloadName = "Sample_Report_Name"
    };
}

预期输出:

Val One, Val Two
3224.12,4122
2030.20,5555

奇怪的输出:

Val One, Val Two
"3224,12",4122
"2030,20",5555

推荐答案

问题是,运行该代码的计算机的CurrentCulture使用逗号而不是句点来表示小数点.使用CultureInfo.InvariantCulture而不是CultureInfo.CurrentCulture应该可以解决格式问题.

此外,您还可以使用csv.WriteRecords(records)来简化代码.

var records = new List<Foo> {
    new Foo{valOne = 3224.12, valTwo = 4122},
    new Foo{valOne = 2030.20, valTwo = 5555},
};

var config = new CsvConfiguration(CultureInfo.CurrentCulture) { Delimiter = ",", HasHeaderRecord = true };

using (var memoryStream = new MemoryStream())
using (var writer = new StreamWriter(memoryStream))
using (var csv = new CsvWriter(writer, config))
{
    csv.Context.RegisterClassMap<FooMap>();

    csv.WriteRecords(records);

    writer.Flush();
    
    var result = Encoding.UTF8.GetString(memoryStream.ToArray());

    byte[] bytes = Encoding.ASCII.GetBytes(result);

    return new FileContentResult(bytes, "text/csv")
    {
        FileDownloadName = "Sample_Report_Name"
    };
}

Csharp相关问答推荐

C#中的两个线程之间读写浮点类型

Autofac:如何防止丢弃通过ServicCollection注册的服务?

在实际上是List T的 IESEARCH上多次调用First()是否不好?

O(N)测试失败

Unity如何在PlayerPrefs中保存数据?

并行令牌更新

内部接口和类的DI解析

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

N层解决方案上的依赖注入-删除样板

如何向事件添加成员

依赖项注入、工厂方法和处置困境

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

匿名类型的AbstractValidator

如何在C#中正确类型化带有泛型的嵌套类

使用DI实例化带有动态参数的服务?

如何根据分割文本的块数来计算文本的大小?

同时通过多个IEumable<;T&>枚举

LINQ在GROUP BY和JOIN之后获取子列表

从具有泛型类型约束的类继承-Blazor