Open Source Repository

Home /excel/jxl-2.6.12 | Repository Home



jxl/write/biff/NumberFormatRecord.java
/*********************************************************************
*
*      Copyright (C) 2002 Andrew Khan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/

package jxl.write.biff;

import jxl.common.Logger;

import jxl.biff.FormatRecord;

/**
 * A class which contains a number format
 */
public class NumberFormatRecord extends FormatRecord
{
  /**
   * The logger
   */
  private static Logger logger = Logger.getLogger(NumberFormatRecord.class);

  // Dummy class to specify non validation
  protected static class NonValidatingFormat{public NonValidatingFormat(){}};
  
  
  /**
   * Constructor.  Replaces some of the characters in the java number
   * format string with the appropriate excel format characters
   
   @param fmt the number format
   */
  protected NumberFormatRecord(String fmt)
  {
    super();

    // Do the replacements in the format string
    String fs = fmt;

    fs = replace(fs, "E0""E+0");

    fs = trimInvalidChars(fs);

    setFormatString(fs);
  }

  /**
   * Constructor.  Replaces some of the characters in the java number
   * format string with the appropriate excel format characters
   
   @param fmt the number format
   */
  protected NumberFormatRecord(String fmt, NonValidatingFormat dummy)
  {
    super();

    // Do the replacements in the format string
    String fs = fmt;

    fs = replace(fs, "E0""E+0");

    setFormatString(fs);
  }

  /**
   * Remove all but the first characters preceding the # or the 0.
   * Remove all characters after the # or the 0, unless it is a )
   
   @param fs the candidate number format
   @return the string with spurious characters removed
   */
  private String trimInvalidChars(String fs)
  {
    int firstHash = fs.indexOf('#');
    int firstZero = fs.indexOf('0');
    int firstValidChar = 0;

    if (firstHash == -&& firstZero == -1)
    {
      // The string is complete nonsense.  Return a default string
      return "#.###";
    }

    if (firstHash != && firstZero != && 
        firstHash != && firstZero != 1)
    {
      // The string is dodgy.  Find the first valid char
      firstHash = firstHash == -1?firstHash = Integer.MAX_VALUE:firstHash;
      firstZero = firstZero == -1?firstZero = Integer.MAX_VALUE:firstZero;
      firstValidChar = Math.min(firstHash, firstZero);

      StringBuffer tmp = new StringBuffer();
      tmp.append(fs.charAt(0));
      tmp.append(fs.substring(firstValidChar));
      fs = tmp.toString();
    }

    // Now strip of everything at the end that isn't a # or 0
    int lastHash = fs.lastIndexOf('#');
    int lastZero = fs.lastIndexOf('0');

    if (lastHash == fs.length() || 
        lastZero == fs.length())
    {
      return fs;
    }

    // Find the last valid character
    int lastValidChar = Math.max(lastHash, lastZero);

    // Check for the existence of a ) or %
    while ((fs.length() > lastValidChar + 1&&
           (fs.charAt(lastValidChar+1== ')' ||
            (fs.charAt(lastValidChar+1== '%')))
    {
      lastValidChar++;
    }

    return fs.substring(0, lastValidChar+1);
  }
}