/*********************************************************************
*
* 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 == -1 && firstZero == -1)
{
// The string is complete nonsense. Return a default string
return "#.###";
}
if (firstHash != 0 && firstZero != 0 &&
firstHash != 1 && 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);
}
}
|