Действительный пользовательский номер Excel с запятой в конце, рассматриваемый как искаженный десятичным форматом

Ниже приведен допустимый пользовательский числовой формат в Excel: #,##0.0,

Обратите внимание на запятую в конце. Это позволяет Excel уменьшить число на 1000;

аналогично двойная запятая в конце уменьшает число на миллион.

Однако в Java при использовании DecimalFormat при создании этого формата (как показано ниже в коде) возникает исключение с сообщением: искаженный шаблон "#,##0.0,"

String format="#,##0.0,";

DecimalFormat df = new DecimalFormat(format);

Есть ли способ создать этот DecimalFormat, который будет выполнять это масштабирование?

Например, если я применяю тот же шаблон в Excel к числу 705,0, результат, показанный в Excel, равен 0,7.

Это то, что я ожидаю в качестве вывода после выполнения:

String result = df.format(new Double(705.0));

Если нет возможности, я надеюсь, что достигну результата, разделив вручную на 1000, прежде чем применять формат: #,##0.0


person Harpreet    schedule 26.09.2019    source источник
comment
Это CSV правильно? Используете ли вы какую-либо библиотеку, такую ​​​​как Apache POI и т. Д.? Они могут извлекать числовые значения из таких ячеек.   -  person Goion    schedule 26.09.2019
comment
Данные поступают из Excel, и я использую Apache POI для чтения данных. Однако оказывается, что POI внутренне использует DecimalFormat для создания NumberFormat для форматирования значения ячейки. И поскольку это искаженный шаблон в соответствии с DeciamlFormat, POI возвращается к числовому формату по умолчанию (это не то, что я хочу отображать).   -  person Harpreet    schedule 27.09.2019


Ответы (1)


Простым решением для этого было бы просто создать свой собственный подкласс NumberFormat, который использует DecimalFormat внутри, но также отслеживает эти запятые в конце. Что-то типа

public class ExcelFormat extends NumberFormat {
  private DecimalFormat df;
  private int endingCommas;

  public ExcelFormat(String format) {
    //calculate the ending commas. Remove from format
    //create df using the substring with the commas removed
  }

  public String format(double number, StringBuffer buf, FieldPosition fp) {
    //divide the number by what's indicated by the endingCommas
    return df.format(adjustedNumber);
  }

}

person ControlAltDel    schedule 26.09.2019