blob: c506c95b2cae5276e16b6b04eefad8c88fed633f [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*
*************************************************************/
package org.openoffice.xmerge.converter.xml.sxc.minicalc;
/**
* This class is used by <code>MinicalcDecoder</code> to manipulate a
* <code>String</code> containing MiniCalc cell data.
*
* @author Paul Rank
*/
public class MinicalcDataString {
/** The String representation of the MiniCalc data. */
private String data = null;
/**
* Constructor stores the MiniCalc data <code>String</code>.
*
* @param data A <code>String</code> containing MiniCalc
* cell data.
*/
public MinicalcDataString(String data) {
this.data = data;
}
/**
* Checks if the MiniCalc data <code>String</code> is a <i>formula</i>.
*
* @return true if the MiniCalc data <code>String</code> is a
* <i>formula</i>, false if the MiniCalc data <code>String</code>
* is not a <i>formula</i>.
*/
public boolean isFormula() {
if (data.startsWith("=")) {
return true;
}
return false;
}
/**
* Checks if the MiniCalc data <code>String</code> is a <i>percentage</i>.
*
* @return true if the MiniCalc data <code>String</code> is a
* <i>percentage</i>, false if the MiniCalc data
* <code>String</code> is not a <i>percentage</i>.
*/
public boolean isPercent() {
if (data.endsWith("%")) {
return true;
}
return false;
}
/**
* Checks if the MiniCalc data <code>String</code> is a
* <i>boolean</i> value.
*
* @return true if the MiniCalc data <code>String</code> is
* a <i>boolean</i>, false if the MiniCalc data
* <code>String</code> is not a <i>boolean</i>.
*/
public boolean isBoolean() {
if (data.equalsIgnoreCase("false") ||
data.equalsIgnoreCase("true")) {
return true;
}
return false;
}
/**
* Checks if the MiniCalc data <code>String</code> is a <i>date</i>.
*
* @return true if the MiniCalc data <code>String</code> is
* a <i>date</i>, false if the MiniCalc data <code>String</code>
* is not a <i>date</i>.
*/
public boolean isDate() {
// Starting index into the date string - month
int start = 0;
// Search for "/", which separates month from day
int end = data.indexOf("/");
// Separator was found
if (end > 0) {
String monthString = data.substring(start, end);
try {
Float f = Float.valueOf(monthString);
if ((f.intValue() < 0) || (f.intValue() > 12)) {
return false;
}
}
catch (NumberFormatException e) {
// no, it is not a currency type
return false;
}
// start is now the starting index of day
start = end+1;
// Search for "/", which separates day from year
end = data.indexOf("/", start);
// Separator was found
if (end > 0) {
String dayString = data.substring(start, end);
try {
Float f = Float.valueOf(dayString);
if ((f.intValue() < 0) || (f.intValue() > 31))
return false;
}
catch (NumberFormatException e) {
// no, it is not a currency type
return false;
}
} else {
return false;
}
// start is now at the starting index of the year
start = end + 1;
String yearString = data.substring(start);
try {
Float f = Float.valueOf(yearString);
if (f.intValue() < 0) {
return false;
}
}
catch (NumberFormatException e) {
// no, it is not a currency type
return false;
}
} else {
return false;
}
return true;
}
/**
* Checks if the MiniCalc data <code>String</code> is a <i>time</i>.
*
* @return true if the MiniCalc data <code>String</code>
* is a <i>time</i>, false if the MiniCalc data
* <code>String</code> is not a <i>time</i>.
*/
public boolean isTime() {
// Starting index into the time string - hour
int start = 0;
// Search for ":", which separates hour from minute
int end = data.indexOf(":");
// Separator was found
if (end > 0) {
String hourString = data.substring(start, end);
try {
Float f = Float.valueOf(hourString);
if ((f.intValue() < 0) || (f.intValue() > 24))
return false;
}
catch (NumberFormatException e) {
// no, it is not a time type
return false;
}
// start is now the starting index of minute
start = end+1;
// Search for ":", which separates minute from second
end = data.indexOf(":", start);
// Separator was found
if (end > 0) {
String minuteString = data.substring(start, end);
try {
Float f = Float.valueOf(minuteString);
if ((f.intValue() < 0) || (f.intValue() > 60))
return false;
}
catch (NumberFormatException e) {
// no, it is not a time type
return false;
}
// start is now at the starting index of the seconds
start = end+1;
// The seconds are in the string
if (data.length() > start) {
String secondString = data.substring(start);
try {
Float f = Float.valueOf(secondString);
if ((f.intValue() < 0) || (f.intValue() > 60))
return false;
}
catch (NumberFormatException e) {
// no, it is not a time type
return false;
}
}
}
return true;
}
return false;
}
/**
* Checks if the MiniCalc data <code>String</code> is a <i>currency</i>
* value.
*
* @return true if the MiniCalc data <code>String</code> is
* a <i>currency</i>, false if the MiniCalc data
* <code>String</code> is not a <i>currency</i>.
*/
public boolean isCurrency() {
boolean result = false;
// TODO - we currently only check for US currencies
if (data.endsWith("$")) {
String number = data.substring(0, data.length()-1);
try {
Float f = Float.valueOf(number);
result = true;
}
catch (NumberFormatException e) {
// no, it is not a currency type
result = false;
}
}
else if (data.startsWith("$")) {
String number = data.substring(1, data.length());
try {
Float f = Float.valueOf(number);
result = true;
}
catch (NumberFormatException e) {
// no, it is not a currency type
result = false;
}
}
return result;
}
/**
* This method removes the percent sign from the MiniCalc data
* <code>String</code>. If the percent sign is not the last
* character of the MiniCalc data <code>String</code>, the
* MiniCalc data <code>String</code> is returned.
*
* @return The MiniCalc data <code>String</code> minus the
* percent sign. If the MiniCalc data <code>String</code>
* does not begin with a percent sign, the MiniCalc data
* <code>String</code> is returned.
*/
public String percentRemoveSign() {
String number = data;
if (data.endsWith("%")) {
// "%" is the last character, so remove
number = data.substring(0, data.length()-1);
try {
Float f = Float.valueOf(number);
float f1 = f.floatValue()/100f;
Float f2 = new Float(f1);
number = f2.toString();
}
catch (NumberFormatException e) {
// no, it is not a float type
}
}
return number;
}
/**
* This method removes the currency sign from the MiniCalc data
* <code>String</code>. If the currency sign is not the first or
* last character of the MiniCalc data <code>String</code>, the
* MiniCalc data <code>String</code> is returned.
*
* @return The MiniCalc data <code>String</code> minus the currency
* sign. If the MiniCalc data <code>String</code> does not
* begin or end with a currency sign, the MiniCalc
* data <code>String</code> is returned.
*/
public String currencyRemoveSign() {
String number = data;
// TODO - only works with US currencies
if (data.endsWith("$")) {
number = data.substring(0, data.length()-1);
} else if (data.startsWith("$")) {
number = data.substring(1, data.length());
}
return number;
}
/**
* <p>This method converts a MiniCalc date from MiniCalc
* format to StarOffice XML format.</p>
*
* <p>MiniCalc format:</p>
*
* <p><blockquote>
* MM/DD/YY or MM/DD/YYYY
* </blockquote></p>
*
* <p>StarOffice XML format:</p>
*
* <p><blockquote>
* YYYY-MM-DD
* </blockquote></p>
*
* @return The MiniCalc date converted to StarOffice XML
* format.
*/
public String convertToStarDate() {
// The output date string
String out;
String monthString = "01";
String dayString = "01";
String yearString = "1900";
// Starting index into the date string - month
int start = 0;
// Search for "/", which separates month from day
int end = data.indexOf("/");
// Separator was found
if (end > 0) {
monthString = data.substring(start, end);
Integer monthInt = new Integer(monthString);
// Make sure month is 2 digits
if (monthInt.intValue() < 10) {
monthString = "0" + monthString;
}
// start is now the starting index of day
start = end+1;
// Search for "/", which separates day from year
end = data.indexOf("/", start);
// Separator was found
if (end > 0) {
dayString = data.substring(start, end);
Integer dayInt = new Integer(dayString);
// Make sure day is 2 digits
if (dayInt.intValue() < 10) {
dayString = "0" + dayString;
}
// start is now at the starting index of the year
start = end + 1;
// The year is in the string
if (data.length() > start) {
yearString = data.substring(start);
Integer yearInt = new Integer(yearString);
int year = yearInt.intValue();
if (year < 31) {
// MiniCalc years between 0 and 30 correspond to
// 2000 - 2030
year += 2000;
} else if (year < 100) {
// MiniCalc years between 31 and 99 correspond
// to 1931 - 1999
year += 1900;
}
yearString = Integer.toString(year);
}
}
}
// Set out to StarOffice XML date format
out = yearString + "-" + monthString + "-" + dayString;
return out;
}
/**
* This method converts the MiniCalc time from MiniCalc
* format to StarOffice XML format.
*
* <p>MiniCalc format:</p>
*
* <p><blockquote>
* hh:mm:ss
* </blockquote></p>
*
* <p>StarOffice XML format:</p>
*
* <p><blockquote>
* PThhHmmMssS
* </blockquote></p>
*
* @return The MiniCalc time converted to StarOffice XML
* format.
*/
public String convertToStarTime() {
// The output time string
String out;
String hourString = "00";
String minuteString = "00";
String secondString = "00";
// Starting index into the time string - hour
int start = 0;
// Search for ":", which separates hour from minute
int end = data.indexOf(":");
// Separator was found
if (end > 0) {
hourString = data.substring(start, end);
// start is now the starting index of minute
start = end+1;
// Search for ":", which separates minute from second
end = data.indexOf(":", start);
// Separator was found
if (end > 0) {
minuteString = data.substring(start, end);
// start is now at the starting index of the seconds
start = end+1;
// The seconds are in the string
if (data.length() > start) {
secondString = data.substring(start);
}
}
}
// TODO - PT is for pacific time, where can we get the
// localized value from?
// Set to StarOffice XML time format
out = "PT"+hourString+"H"+minuteString+"M"+secondString+"S";
return out;
}
}