src/core/net/sf/basedb/util/formatter/AdaptiveNumberFormatter.java

Code
Comments
Other
Rev Date Author Line
6252 14 Mar 13 nicklas 1 /**
6252 14 Mar 13 nicklas 2   $Id $
6252 14 Mar 13 nicklas 3
6252 14 Mar 13 nicklas 4   Copyright (C) 2013 Nicklas Nordborg
6252 14 Mar 13 nicklas 5
6252 14 Mar 13 nicklas 6   This file is part of BASE - BioArray Software Environment.
6252 14 Mar 13 nicklas 7   Available at http://base.thep.lu.se/
6252 14 Mar 13 nicklas 8
6252 14 Mar 13 nicklas 9   BASE is free software; you can redistribute it and/or
6252 14 Mar 13 nicklas 10   modify it under the terms of the GNU General Public License
6252 14 Mar 13 nicklas 11   as published by the Free Software Foundation; either version 3
6252 14 Mar 13 nicklas 12   of the License, or (at your option) any later version.
6252 14 Mar 13 nicklas 13
6252 14 Mar 13 nicklas 14   BASE is distributed in the hope that it will be useful,
6252 14 Mar 13 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6252 14 Mar 13 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6252 14 Mar 13 nicklas 17   GNU General Public License for more details.
6252 14 Mar 13 nicklas 18
6252 14 Mar 13 nicklas 19   You should have received a copy of the GNU General Public License
6252 14 Mar 13 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6252 14 Mar 13 nicklas 21 */
6252 14 Mar 13 nicklas 22 package net.sf.basedb.util.formatter;
6252 14 Mar 13 nicklas 23
6252 14 Mar 13 nicklas 24 import net.sf.basedb.util.Values;
7647 13 Mar 19 nicklas 25 import net.sf.basedb.util.excel.ExcelValue;
6252 14 Mar 13 nicklas 26
6252 14 Mar 13 nicklas 27 /**
6252 14 Mar 13 nicklas 28    Formats a number for output on a web page adapting thwe number of 
6252 14 Mar 13 nicklas 29    decimals depending on the order of magnitude of the value. The precision
6252 14 Mar 13 nicklas 30    value is defined to be the number of decimals to use for values 
6252 14 Mar 13 nicklas 31    between 1 and 10 (not inclusive). The number of decimals are then
6252 14 Mar 13 nicklas 32    increase or decreased for each order of magnitude that the value
6252 14 Mar 13 nicklas 33    get smaller or larger.
6252 14 Mar 13 nicklas 34
6252 14 Mar 13 nicklas 35   @author nicklas
6252 14 Mar 13 nicklas 36   @since 3.2.2
6252 14 Mar 13 nicklas 37   @base.modified $Date$
6252 14 Mar 13 nicklas 38 */
6252 14 Mar 13 nicklas 39 public class AdaptiveNumberFormatter
6252 14 Mar 13 nicklas 40   extends NumberFormatter
6252 14 Mar 13 nicklas 41 {
6252 14 Mar 13 nicklas 42
6252 14 Mar 13 nicklas 43   private final int precision;
6252 14 Mar 13 nicklas 44   /**
6252 14 Mar 13 nicklas 45     Create a new number formatter.
6252 14 Mar 13 nicklas 46     @param precision The number of decimals to display for values 
6252 14 Mar 13 nicklas 47       between 1 and 10 (for lower and higher values the number of decimals is
6252 14 Mar 13 nicklas 48       adjusted), or a negative value to display all decimals
6252 14 Mar 13 nicklas 49     @param doubleValues If the {@link #parseString(String)} should return double 
6252 14 Mar 13 nicklas 50       or float values
6252 14 Mar 13 nicklas 51     @see Values#formatNumber(Float, int)
6252 14 Mar 13 nicklas 52   */
6252 14 Mar 13 nicklas 53   public AdaptiveNumberFormatter(int precision, boolean doubleValues)
6252 14 Mar 13 nicklas 54   {
6252 14 Mar 13 nicklas 55     super(precision, doubleValues);
6252 14 Mar 13 nicklas 56     this.precision = precision;
6252 14 Mar 13 nicklas 57   }
6252 14 Mar 13 nicklas 58   
6252 14 Mar 13 nicklas 59   /*
6252 14 Mar 13 nicklas 60     From the Formatter interface
6252 14 Mar 13 nicklas 61     -------------------------------------------
6252 14 Mar 13 nicklas 62   */
6252 14 Mar 13 nicklas 63   @Override
6252 14 Mar 13 nicklas 64   public String format(Number value)
6252 14 Mar 13 nicklas 65   {
6252 14 Mar 13 nicklas 66     if (value == null) return "";
7647 13 Mar 19 nicklas 67     return Values.formatNumber(value.floatValue(), getNumDecimals(value));
7647 13 Mar 19 nicklas 68   }
7647 13 Mar 19 nicklas 69   // -------------------------------------------
7647 13 Mar 19 nicklas 70
7647 13 Mar 19 nicklas 71   /**
7647 13 Mar 19 nicklas 72     @since 3.15
7647 13 Mar 19 nicklas 73   */
7647 13 Mar 19 nicklas 74   @Override
7647 13 Mar 19 nicklas 75   public ExcelValue<Number> toExcelValue(Number value) 
7647 13 Mar 19 nicklas 76   {
7647 13 Mar 19 nicklas 77     return ExcelValue.asNumber(value, getNumDecimals(value));
7647 13 Mar 19 nicklas 78   }
7647 13 Mar 19 nicklas 79
7647 13 Mar 19 nicklas 80   private int getNumDecimals(Number value)
7647 13 Mar 19 nicklas 81   {
6252 14 Mar 13 nicklas 82     int numDecimals = precision;
7647 13 Mar 19 nicklas 83     if (precision >= 0 && value != null)
6252 14 Mar 13 nicklas 84     {
6252 14 Mar 13 nicklas 85       int orderOfMagnitude = (int)Math.floor(Math.log10(Math.abs(value.doubleValue()))); // =0 for values between 1-10
6252 14 Mar 13 nicklas 86       if (orderOfMagnitude < 0) orderOfMagnitude++; // One decimal less for value between 0 and 1
6252 14 Mar 13 nicklas 87       numDecimals -= orderOfMagnitude;
6252 14 Mar 13 nicklas 88       if (numDecimals < 0) numDecimals = 0;
6252 14 Mar 13 nicklas 89       if (numDecimals > 7) numDecimals = 7;
6252 14 Mar 13 nicklas 90     }
7647 13 Mar 19 nicklas 91     return numDecimals;
6252 14 Mar 13 nicklas 92   }
6252 14 Mar 13 nicklas 93 }