使用类映射的CsvHelper格式十进制

使用类映射的CsvHelper格式十进制,csvhelper,Csvhelper,我在文件中有一些列,它们的值类似于“00012000”,需要使用CsvHelper类映射将其转换为“1200.00”。我目前正在为这些列使用Decimal类型,并且在类映射中使用NumberStyle,它在开始时截断了零。所以我得到的值是“120000”。我尝试使用“TypeConverterOption.Format(“0.00”)”但没有成功。因此,我想知道是否有一种方法可以使用ClassMap将值“120000”转换为“1200.00”。我甚至可以除以100,但我不想在我使用字段的任何地方

我在文件中有一些列,它们的值类似于“00012000”,需要使用CsvHelper类映射将其转换为“1200.00”。我目前正在为这些列使用Decimal类型,并且在类映射中使用NumberStyle,它在开始时截断了零。所以我得到的值是“120000”。我尝试使用“TypeConverterOption.Format(“0.00”)”但没有成功。因此,我想知道是否有一种方法可以使用ClassMap将值“120000”转换为“1200.00”。我甚至可以除以100,但我不想在我使用字段的任何地方都这样做,所以需要在类映射中这样做。提前谢谢你在这件事上帮助我

在类映射中,我有以下代码: csvConfig.TypeConverterOptions缓存.GetOptions().NumberStyle= NumberStyles.Number | NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent


例如:“00012000”->“1200.00”(现在我得到的值是“120000”)

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

公共类程序
{
静态void Main(字符串[]参数)
{
使用(var stream=new MemoryStream())
使用(var writer=新的StreamWriter(流))
使用(变量读取器=新的流读取器(流))
使用(var csv=new CsvReader(reader,CultureInfo.InvariantCulture))
{
writer.WriteLine(“Id,MoveDecimalPoint,NoMoveDecimalPoint”);
WriteLine(“10001200000000120000”);
writer.Flush();
流位置=0;
csv.Configuration.RegisterClassMap();
var records=csv.GetRecords().ToList();
}
}
}
公开课Foo
{
公共int Id{get;set;}
公共小数点{get;set;}
公共十进制NoMoveDecimalPoint{get;set;}
}
公共类FooClassMap:ClassMap
{
公共类映射()
{
自动映射(CultureInfo.InvariantCulture);
Map(m=>m.MoveDecimalPoint).TypeConverter();
}
}
公共类MoveDecimalConverter:DecimalConverter
{
公共重写对象ConvertFromString(字符串文本、IReaderRow行、MemberMapData MemberMapData)
{
var numberStyle=memberMapData.TypeConverterOptions.numberStyle??NumberStyles.Number;
if(decimal.TryParse(text,numberStyle,memberMapData.TypeConverterOptions.CultureInfo,out vard))
{
返回d/100;
}
返回base.ConvertFromString(文本、行、memberMapData);
}
}
如果希望所有十进制值都移动两位小数,可以将
MoveDecimalConverter
添加到配置中

公共类程序
{
静态void Main(字符串[]参数)
{
使用(var stream=new MemoryStream())
使用(var writer=新的StreamWriter(流))
使用(变量读取器=新的流读取器(流))
使用(var csv=new CsvReader(reader,CultureInfo.InvariantCulture))
{
writer.WriteLine(“Id,MoveDecimalPoint,NoMoveDecimalPoint”);
WriteLine(“10001200000000120000”);
writer.Flush();
流位置=0;
csv.Configuration.TypeConverterCache.AddConverter(新的MoveDecimalConverter());
var records=csv.GetRecords().ToList();
}
}
}
您还可以使用
ConvertUsing()

公共类程序
{
静态void Main(字符串[]参数)
{
使用(var stream=new MemoryStream())
使用(var writer=新的StreamWriter(流))
使用(变量读取器=新的流读取器(流))
使用(var csv=new CsvReader(reader,CultureInfo.InvariantCulture))
{
writer.WriteLine(“Id,MoveDecimalPoint,NoMoveDecimalPoint”);
WriteLine(“10001200000000120000”);
writer.Flush();
流位置=0;
csv.Configuration.RegisterClassMap();
var records=csv.GetRecords().ToList();
}
}
}
公开课Foo
{
公共int Id{get;set;}
公共小数点{get;set;}
公共十进制NoMoveDecimalPoint{get;set;}
}
公共类FooClassMap:ClassMap
{
公共类映射()
{
自动映射(CultureInfo.InvariantCulture);
映射(m=>m.MoveDecimalPoint).ConvertUsing(行=>
{
if(decimal.TryParse(行[“MoveDecimalPoint”]、NumberStyles.Number、row.Configuration.CultureInfo、out变量d))
{
返回d/100;
} 
其他的
{
返回0;
}
});
}
}

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

公共类程序
{
静态void Main(字符串[]参数)
{
使用(var stream=new MemoryStream())
使用(var writer=新的StreamWriter(流))
使用(变量读取器=新的流读取器(流))
使用(var csv=new CsvReader(reader,CultureInfo.InvariantCulture))
{
writer.WriteLine(“Id,MoveDecimalPoint,NoMoveDecimalPoint”);
WriteLine(“10001200000000120000”);
writer.Flush();
流位置=0;
csv.Configuration.RegisterClassMap();
var records=csv.GetRecords().ToList();
}
}
}
公开课Foo
{
公共int Id{get;set;}
公共小数点{get;set;}
公共十进制NoMoveDecimalPoint{get;set;}
}
公共类FooClassMap:ClassMap
{
公共类映射()
{
自动映射(CultureInfo.InvariantCulture);
Map(m=>m.MoveDecimalPoint).TypeConverter();
}
}
公共类MoveDecimalConverter:DecimalConverter
{
公共重写对象ConvertFromString(字符串文本、IReaderRow行、MemberMapData MemberMapData)
{
var numberStyle=memberMapData.TypeConverterOptions.numberStyle??NumberStyles.Number;
if(decimal.TryParse(text,numberStyle,memberMapData.typeconverter)选项