【问题标题】:Parsing double superCSV with comma as decimal separator?用逗号作为小数分隔符解析双 superCSV?
【发布时间】:2012-12-24 15:13:46
【问题描述】:

我想使用 SuperCSV CellProcessor 解析一个以逗号作为小数分隔符(',' 而不是 '.')的双精度数

我想将第一个元素 (0,35) 解析为 Double

0,35;40000,45 

我尝试过类似的方法:

   /** FRENCH_SYMBOLS */
private static final DecimalFormatSymbols FRENCH_SYMBOLS = new DecimalFormatSymbols(Locale.FRANCE);
  DecimalFormat   df =   new DecimalFormat();
  df.setDecimalFormatSymbols(FRENCH_SYMBOLS);
 final CellProcessor[] processors = new CellProcessor[] {
                new NotNull(new ParseDouble(new FmtNumber(df))),
                new NotNull(new ParseBigDecimal(FRENCH_SYMBOLS)) };

ParseBigDecimal 工作得很好,但 parseDouble 似乎不起作用,它给了我一个异常:org.supercsv.exception.SuperCsvCellProcessorException: '0,35' could not be parsed as a Double

【问题讨论】:

  • 在数字周围使用引号,例如:“1,000”、“20,000”、50、“test”。还是您的意思是要使用“;”作为分界线。你想把这条线转换成什么?
  • 我想将该字段 0,35 解析为 Double,它给了我一个异常:org.supercsv.exception.SuperCsvCellProcessorException: '0,35' could not be parsed as a Double
  • 我们可以根据自己的特殊需求创建一个实现 DoubleCellProcessor 的全新类supercsv.sourceforge.net/examples_new_cell_processor.html

标签: supercsv


【解决方案1】:

您完全正确 - ParseDouble 不支持法式小数点分隔符(逗号),但 ParseBigDecimal 支持。如果您认为这是一个有用的功能,何不提交feature request

最简单的解决方法是简单地将StrReplace 链接到ParseDouble 之前,以将逗号转换为句号。

new StrReplace(",", ".", new ParseDouble())

或者,您也可以写一个custom cell processor

  • 解析一个 Double(带有可配置的小数分隔符)

  • 将 BigDecimal 转换为 Double(调用 doubleValue()) - 然后可以将其链接在您的 new ParseBigDecimal(FRENCH_SYMBOLS) 之后

哦,以后您可能想提一下,您的文件是用分号分隔的,并且您已使用 CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE 设置了 Super CSV :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2014-07-16
    • 1970-01-01
    • 2019-12-30
    相关资源
    最近更新 更多