【问题标题】:CSVHelper Exponent with comma instead dotCSVHelper 指数用逗号代替点
【发布时间】:2020-12-22 13:02:29
【问题描述】:

我正在使用 CSVHelper,但我不知道如何解决这个问题。

问题: 我正在尝试读取带有“3,23E+11”之类数字的 CSV,但出现此错误:

The conversion cannot be performed.
Text: '3,27E+11'
MemberType: System.Nullable`1[[System.Decimal, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]
TypeConverter: 'CsvHelper.TypeConversion.NullableConverter'

我需要用逗号而不是点来读取它。

我已经尝试过改变文化信息

 public IEnumerable<DTO> ReadFile(Task<Stream> file)
        {
            IEnumerable<DTO> records;
            CultureInfo nfi = new CultureInfo("de-DE", false);
            nfi.NumberFormat.NumberDecimalSeparator = ",";

            using (var reader = new StreamReader(file.Result))
            using (var csv = new CsvReader(reader, nfi))
                try
                {
                    csv.Configuration.PrepareHeaderForMatch = (header, index) => header.Trim();
                    csv.Configuration.TrimOptions = TrimOptions.Trim;
                    csv.Configuration.TypeConverterOptionsCache.GetOptions<decimal>().NumberStyle = NumberStyles.Number | NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent | NumberStyles.AllowLeadingSign;
                    csv.Configuration.BadDataFound = null;
                    csv.Configuration.MissingFieldFound = null;
                    csv.Configuration.Delimiter = ";";
                    csv.Configuration.RegisterClassMap<CSVMapper>();
                    records = csv.GetRecords<DTO>().ToList();
                }
                catch (Exception e)
                {
                    throw e;
                }
            return records;
        }

我不知道是否存在某种方法来使用逗号而不是点解析单元格中的值:/

谢谢

【问题讨论】:

  • 你能贴几行 CSV 文件吗?
  • 您是否尝试过将csv.Configuration.CultureInfo 设置为使用逗号作为小数分隔符的区域性? stackoverflow.com/questions/55076433/…
  • 您能分享CSVMapperDTO 和一个示例CSV 文件吗?

标签: c# .net-core csvhelper


【解决方案1】:

您已经为decimal 设置了号码配置,但您的属性类型是可以为空的 (decimal?)。如果您有任何不可为空的 decimal 属性,请添加以下行,如果您只有可空版本 (decimal?),请替换现有的行(请注意下面代码中的 ?

csv.Configuration.TypeConverterOptionsCache.GetOptions<decimal?>().NumberStyle = 
    NumberStyles.Number | NumberStyles.AllowDecimalPoint | 
    NumberStyles.AllowExponent | NumberStyles.AllowLeadingSign;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多