我首先尝试读取一个包含记录的文件,其中包含值为“120,000.00”的列。我想将此列转换为可为空的小数。 尽管该文件源自瑞士,但 C# 似乎不适合这种格式,并且帮助程序(使用 de-CH CultureInfo)引发了 TypeConverterException。所以我用自定义替换器删除了逗号,解决了转换问题。 不幸的是,我现在得到了 ReaderException:
无法将“System.String”类型的对象转换为“System.Nullable`1[System.Decimal]”类型
为什么类型转换成功后仍然抛出异常?该行为可以重现吗? (CsvHelper 版本 15.0.8,CsvHelper.CsvReader.d__63`1.MoveNext() 处的堆栈跟踪)
public class MyFile
{
public decimal? MyField { get; set; }
}
_
public MyFileMap : ClassMap<MyFile>
{
public MyFileMap()
{
Map(x => x.MyField).Name("My Field").TypeConverterOption.NumberStyles(System.Globalization.NumberStyles.Number).TypeConverter<DecimalStringReplacer>(); //custom replacer removes the comma
}
}
_
var records = csvReader.GetRecords<MyFile>() //csvReader uses CultureInfo "de-CH". Raises ReaderException
这是因为 de-CH 的
NumberGroupSeparator
是 ’
而不是 ,
。
这会很好用:
using var reader = new StringReader("120’000.00");
using var csvReader = new CsvHelper.CsvReader(reader, CultureInfo.GetCultureInfo("de-CH"));
if (csvReader.Read())
{
var result = csvReader.GetField<decimal>(0);
}