2013-06-11 8 views
2

Я использую Java 1.6, и мы используем java.text.DecimalFormat для форматирования чисел. НапримерОбработка десятичного формата null

DecimalFormat df = new DecimalFormat(); 
    df.setPositivePrefix("$"); 
    df.setNegativePrefix("(".concat($)); 
    df.setNegativeSuffix(")"); 
    df.setMaximumFractionDigits(2); 
    df.setMinimumFractionDigits(2); 
    df.setGroupingSize(3); 

    df.format(new java.math.BigDecimal(100); 

Мой сбой приложения всякий раз, когда передача null значение в df.format(null)

Error: cannot format given object as a number 

Мой вопрос, как я могу справиться с null значение в df.format() функции?

Я хотел бы передать значение null в df.format() функции и хотел бы, чтобы он возвращал 0.00 вместо вышеуказанной ошибки.

Спасибо Вам

С уважением,

Ankush

+0

Это не ясно; где в вашем предыдущем коде вы передаете 'null' в' df.format'? –

+0

использовать оператор поворота, чтобы проверить нулевое значение стоимости, как значение! = Null? Значение: 0,00 –

+0

@Oli, df.format (Value_to_be_formatted) получает вызов из JasperReports (не здесь, здесь). Я хотел изменить метод format() для принятия нулевых значений и вернуть 0 в случае ввода нуля. –

ответ

9

Мой сбой приложения всякий раз, когда передача нулевое значение

Да, это будет. Это documented поведение:

Броски:IllegalArgumentException - если number является null или не является экземпляром Number.

Следующая:

Я хотел бы передать нуль для df.format функции() и хотел бы его вернуть 0.00 вместо выше ошибки.

Нет, это не сработает. Это документировано, чтобы не работать. Просто не проходите null в ... это достаточно легко обнаружить. Таким образом, вы могли бы использовать это:

String text = value == null ? "0.00" : df.format(value); 

Или

String text = df.format(value == null ? BigDecimal.ZERO : value); 
+0

+1 бы удвоил, если бы мог;) –

+0

df.format (значение == null? BigDecimal.ZERO: value); Это именно то, что мы делаем прямо сейчас. Я блуждал, если мы могли перегрузить функцию формата, чтобы принять значение null и вернуть ноль. –

+0

@AnkushChhabra: Нет. Я имею в виду, вы * можете * расширить 'DecimalFormat' себя, переопределить' format' и разорвать существующий контракт, но это будет очень плохая идея. Просто поместите это в какой-то статический вспомогательный метод, и все будет в порядке. –

1

Расширение DecimalFormat нарушило бы его API (правильно отметил Джон тарелочкам), но вы можете реализовать свой собственный формат, который оборачивает данный DecimalFormat:

public class OptionalValueFormat extends Format { 

    private Format wrappedFormat; 

    private String nullValue; 

    public OptionalValueFormat(Format wrappedFormat, String nullValue) { 
    this.wrappedFormat = wrappedFormat; 
    this.nullValue = nullValue; 
    } 

    @Override 
    public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { 
    if (obj == null) { 
     // Just add our representation of the null value 
     return toAppendTo.append(nullValue); 
    } 

    // Let the default format do its job 
    return wrappedFormat.format(obj, toAppendTo, pos); 
    } 

    @Override 
    public Object parseObject(String source, ParsePosition pos) { 
    if (source == null || nullValue.equals(source)) { 
     // Unwrap null 
     return null; 
    } 

    // Let the default parser do its job 
    return wrappedFormat.parseObject(source, pos); 
    } 

} 

Это не нарушило бы API из java.text.Format, как один только требует toAppendTo и pos быть не нулевым.

Пример использования OptionalValueFormat:

DecimalFormat df = ... 

OptionalValueFormat format = new OptionalValueFormat(df, "0.00"); 
System.out.println(format.format(new java.math.BigDecimal(100))); 
System.out.println(format.format(null)); 

Результат:

100 
0.00 
не

К сожалению, ни один из вспомогательных библиотек, я знаю, предлагают такой формат обертки, так что вам придется добавить этот класс ваш проект.

Смежные вопросы