【问题标题】:How to control formatting of floats with CsvHelper如何使用 CsvHelper 控制浮点数的格式
【发布时间】:2021-01-08 03:43:19
【问题描述】:

要在写入日期时间时控制格式,可以这样做

var options = new CsvHelper.TypeConversion.TypeConverterOptions { 
  Formats = new[] { 
    "yyyy-MM-dd HH:mm" 
  } 
};

我希望同样指定一个图片字符串来控制浮点数的格式。我试过了。

var options = new CsvHelper.TypeConversion.TypeConverterOptions {
  Formats = new[] {
    "yyyy-MM-dd HH:mm", 
    "###.#" 
  } 
};

但它不起作用。

如何将格式字符串floatdouble 关联?

我需要将 format 强制为我的第二个示例 ("###.#") 中显示的图片字符串,因为 FORTRAN 程序消耗了生成的 CSV em> 非常挑剔,不会接受"245" 而它期望"245.0"

消费程序的源不可用。建议我修复它没有帮助。

【问题讨论】:

  • 您的问题的答案可从“我试过这个”之后的示例代码中获得。对于不阅读示例代码的人,我已经在文中解释了这一点。我尽量不提供不相关的细节,比如它是一个 FORTRAN 程序,因为人们关注它们。这是关于在 C# 中控制 CsvHelper。

标签: c# csvhelper


【解决方案1】:

要强制添加0需要使用zero placeholder:

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Time { get; set; }
    public float Value1 { get; set; }
    public double Value2 { get; set; }
}

var records = new List<Foo>
{
    new Foo { Id = 1, Name = "one", Time = DateTime.Now, Value1 = 1.123f, Value2 = 12345.789 },
    new Foo { Id = 2, Name = "two", Time = DateTime.Now, Value1 = 123f, Value2 = 44 },
};

var dt_options = new CsvHelper.TypeConversion.TypeConverterOptions { 
    Formats = new[] {  "yyyy-MM-dd HH:mm" }  };
var float_options = new CsvHelper.TypeConversion.TypeConverterOptions { 
    Formats = new[] { "###.0" } };

using (var writer = new StreamWriter("file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.Configuration.TypeConverterOptionsCache.AddOptions<DateTime>(dt_options);
    csv.Configuration.TypeConverterOptionsCache.AddOptions<float>(float_options);
    csv.Configuration.TypeConverterOptionsCache.AddOptions<double>(float_options);

    csv.WriteRecords(records);
}
Id,Name,Time,Value1,Value2
1,one,2021-01-07 20:54,1.1,12345.8
2,two,2021-01-07 20:54,123.0,44.0

如果需要,配置 CsvWriter 以将所有值包装到引号中:

..
using (var csv = new CsvWriter(writer, 
    new CsvConfiguration(CultureInfo.InvariantCulture) { 
        ShouldQuote = (_, _) => true  }))
..

/*
"Id","Name","Time","Value1","Value2"
"1","one","2021-01-07 21:11","1.1","12345.8"
"2","two","2021-01-07 21:11","123.0","44.0"
*/

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 2018-10-28
  • 2019-11-13
  • 2013-06-22
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2020-06-03
相关资源
最近更新 更多