CsvHelper使用ClassMap格式化十进制



我在文件中有列,它们的值类似于;000120000";需要转换为";1200.00〃;使用CsvHelper ClassMap。我目前对这些列使用Decimal类型,并且ClassMap中的NumberStyle在开头截断了零。所以我得到的值是";120000";。我试着用";TypeConverterOption.Format("0.00"(;但没有运气。所以我想知道是否有一种方法可以将值";120000";至";1200.00〃;使用ClassMap。我甚至可以除以100,但不想在我使用字段的任何地方都这样做,所以需要在ClassMap中做这个逻辑。事先谢谢你在这件事上帮我。

在ClassMap中,我有以下代码:csvConfig.TypeConverterOptionsCache.GetOptions<十进制>((.NumberStyle=NumberStyles.Number|NumberStyles.AllowDecimalPoint|NumberStyle。AllowExponent;

例如:";000120000"->quot;1200.00〃;(现在我得到的值是"120000"(

这是一种方法。使用自定义转换器。

public class Program
{
static void Main(string[] args)
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("Id,MoveDecimalPoint,NoMoveDecimalPoint");
writer.WriteLine("1,000120000,000120000");
writer.Flush();
stream.Position = 0;
csv.Configuration.RegisterClassMap<FooClassMap>();
var records = csv.GetRecords<Foo>().ToList();
}
}
}
public class Foo
{
public int Id { get; set; }
public decimal MoveDecimalPoint { get; set; }
public decimal NoMoveDecimalPoint { get; set; }
}
public class FooClassMap : ClassMap<Foo>
{
public FooClassMap()
{
AutoMap(CultureInfo.InvariantCulture);
Map(m => m.MoveDecimalPoint).TypeConverter<MoveDecimalConverter>();
}
}
public class MoveDecimalConverter : DecimalConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
var numberStyle = memberMapData.TypeConverterOptions.NumberStyle ?? NumberStyles.Number;
if (decimal.TryParse(text, numberStyle, memberMapData.TypeConverterOptions.CultureInfo, out var d))
{
return d / 100;
}
return base.ConvertFromString(text, row, memberMapData);
}
}

如果您想让所有的十进制值移动两个小数位,您可以将MoveDecimalConverter添加到配置中。

public class Program
{
static void Main(string[] args)
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("Id,MoveDecimalPoint,NoMoveDecimalPoint");
writer.WriteLine("1,000120000,000120000");
writer.Flush();
stream.Position = 0;
csv.Configuration.TypeConverterCache.AddConverter<decimal>(new MoveDecimalConverter());
var records = csv.GetRecords<Foo>().ToList();
}
}
}

您也可以使用ConvertUsing()

public class Program
{
static void Main(string[] args)
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("Id,MoveDecimalPoint,NoMoveDecimalPoint");
writer.WriteLine("1,000120000,000120000");
writer.Flush();
stream.Position = 0;
csv.Configuration.RegisterClassMap<FooClassMap>();
var records = csv.GetRecords<Foo>().ToList();
}
}
}
public class Foo
{
public int Id { get; set; }
public decimal MoveDecimalPoint { get; set; }
public decimal NoMoveDecimalPoint { get; set; }
}
public class FooClassMap : ClassMap<Foo>
{
public FooClassMap()
{
AutoMap(CultureInfo.InvariantCulture);
Map(m => m.MoveDecimalPoint).ConvertUsing(row =>
{
if (decimal.TryParse(row["MoveDecimalPoint"], NumberStyles.Number, row.Configuration.CultureInfo, out var d))
{
return d / 100;
} 
else
{
return 0;
}
});
}
}

最新更新