/*
* #%L
* data-exporter
* %%
* Copyright (C) 2012 - 2013 http://www.brsanthu.com
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package com.brsanthu.dataexporter.model;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import com.brsanthu.dataexporter.util.Util;
/**
* Number column which displays the formatted numbers.
*
* @author Santhosh Kumar
*
*/
public class NumberColumn extends Column {
private NumberFormat formatter = null;
private int precision = 2;
private boolean grouping = true;
private boolean bracketNegitive = false;
public NumberColumn(String name, String title, int width, NumberFormat formatter) {
this(name, title, width, AlignType.MIDDLE_RIGHT, formatter);
}
public NumberColumn(String name, String title, int width, int precision) {
this(name, title, width, AlignType.MIDDLE_RIGHT, precision);
}
public NumberColumn(String name, int width, int precision) {
this(name, width, AlignType.MIDDLE_RIGHT, precision);
}
public NumberColumn(String name, int width, NumberFormat formatter) {
this(name, null, width, AlignType.MIDDLE_RIGHT, formatter);
}
public NumberColumn(String name, int width, AlignType align, int precision) {
this(name, null, width, align, precision);
}
public NumberColumn(String name, String title, int width, AlignType align, int precision) {
super(name, title, width, align);
this.precision = precision;
}
public NumberColumn(String name, String title, int width, AlignType align, NumberFormat formatter) {
super(name, title, width, align);
this.formatter = formatter;
}
public int getPrecision() {
return precision;
}
public NumberColumn setPrecision(int precision) {
this.precision = precision;
return this;
}
public boolean isGrouping() {
return grouping;
}
public NumberColumn setGrouping(boolean grouping) {
this.grouping = grouping;
return this;
}
public boolean isBracketNegitive() {
return bracketNegitive;
}
public NumberColumn setBracketNegitive(boolean bracketNegitive) {
this.bracketNegitive = bracketNegitive;
return this;
}
@Override
public int getMaxRowHeight(CellDetails cellDetails) {
return (int) Math.ceil((float) format(cellDetails.getCellValue()).length()/getWidth());
}
@Override
public String format(CellDetails cellDetails) {
return format(cellDetails.getCellValue());
}
public String format(Object value) {
if (formatter == null) {
String formatString = "";
if (isGrouping()) {
formatString = "#,###,###";
} else {
formatString = "0";
}
if (isBracketNegitive()) {
formatString = formatString + ";(#)";
}
if (precision > 0) {
formatter = new DecimalFormat(formatString +"." + Util.createString("0", precision));
} else {
formatter = new DecimalFormat(formatString);
}
}
String formattedString;
try {
formattedString = formatter.format(value);
} catch (Exception e) {
throw new RuntimeException("Exception while formatting the value " + value + " of type "
+ value.getClass().getName() + " as number for column " + this, e);
}
return formattedString;
}
}