/*******************************************************************************
*
* Copyright 2010 Alexandru Craciun, and individual contributors as indicated
* by the @authors tag.
*
* This 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 3 of
* the License, or (at your option) any later version.
*
* This software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
******************************************************************************/
package org.netxilia.functions;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Iterator;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.netxilia.api.value.GenericValueType;
import org.netxilia.api.value.IGenericValue;
import org.netxilia.api.value.IGenericValueParseService;
import org.netxilia.spi.formula.Functions;
import org.netxilia.spi.formula.SkipFunction;
import org.springframework.beans.factory.annotation.Autowired;
/*
*
*/
@Functions
public class TextFunctions {
@Autowired
private IGenericValueParseService parseService;
@SkipFunction
public IGenericValueParseService getParseService() {
return parseService;
}
@SkipFunction
public void setParseService(IGenericValueParseService parseService) {
this.parseService = parseService;
}
public IGenericValue VALUE(String text) {
return parseService.parse(text);
}
public String CHAR(int number) {
return String.valueOf((char) number);
}
/**
* Returns a numeric code for the first character in a text string. Text is the text for which the code of the first
* character is to be found.
*
* @return
*/
public int CODE(String text) {
return text.isEmpty() ? 0 : text.charAt(0);
}
public String CONCATENATE(Iterator<String> values) {
StringBuilder sb = new StringBuilder();
while (values.hasNext()) {
sb.append(values.next());
}
return sb.toString();
}
public String DOLLAR(double value, int decimals) {
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setMaximumFractionDigits(decimals);
return format.format(value);
}
public boolean EXACT(String text1, String text2) {
return text1.equals(text2);
}
public int FIND(String findText, String text, int start) {
return text.indexOf(findText, start + 1) + 1;
}
public String FIXED(double number, int decimals, boolean no_thousands_separator) {
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(decimals);
format.setGroupingUsed(!no_thousands_separator);
return format.format(number);
}
public String LEFT(String text, int number) {
return text.substring(0, number);
}
public int LEN(String text) {
return text.length();
}
public String LOWER(String text) {
return text.toLowerCase();
}
public String MID(String text, int start, int number) {
return text.substring(start, start - 1 + number);
}
/**
* Capitalizes the first letter in all words of a text string.
*
* @return
*/
public String PROPER(String text) {
return WordUtils.capitalize(text);
}
/**
* Replaces part of a text string with a different text string. This function can be used to replace both characters
* and numbers (which are automatically converted to text). The result of the function is always displayed as text.
* To perform further calculations with a number which has been replaced by text, convert it back to a number using
* the VALUE function. Any text containing numbers must be enclosed in quotation marks so it is not interpreted as a
* number and automatically converted to text. Text is text of which a part will be replaced. Position is the
* position within the text where the replacement will begin. Length is the number of characters in text to be
* replaced. New_text is the text which replaces text.
*
* @return
*/
public String REPLACE(String text, int position, int length, String newText) {
int p = position - 1; // position is 1-based
if (p >= text.length() || p + length >= text.length()) {
return text;
}
return text.substring(0, p) + newText + text.substring(p + length);
}
public String REPT(String text, int number) {
return StringUtils.repeat(text, number);
}
public String RIGHT(String text, int number) {
return text.substring(Math.max(0, text.length() - number), text.length());
}
/**
* Returns the position of a text segment within a character string. The start of the search can be set as an
* option. The search text can be a number or any sequence of characters. The search is not case-sensitive.
* Find_text is the text to be searched for. Text is the text where the search will take place. Position (optional)
* is the position in the text where the search is to start.
*
* @return
*/
public int SEARCH(String findText, String text, int start) {
return text.toLowerCase().indexOf(findText.toLowerCase(), start - 1) + 1;
}
/**
* Splits text based on the given delimiter, putting each section into a separate column in the row.
*
* @param string
* @param delimiter
* @return
*/
// public String SPLIT(String string, String delimiter){
//
// }
/**
* Substitutes new text for old text in a string. Text is the text in which text segments are to be exchanged.
* Search_text is the text segment that is to be replaced (a number of times). New text is the text that is to
* replace the text segment. Occurrence (optional) indicates how many occurrences of the search text are to be
* replaced.
*/
public String SUBSTITUTE(String text, String searchText, String newText, int occurrence) {
return StringUtils.replace(text, searchText, newText, occurrence == 0 ? -1 : occurrence);
}
/**
* Converts a number to a blank text string. Value is the value to be converted. Also, a reference can be used as a
* parameter. If the referenced cell includes a number or a formula containing a numerical result, the result will
* be an empty string.
*
* @param value
* @return
*/
public String T(IGenericValue value) {
if (value.getValueType() == GenericValueType.STRING) {
return value.getStringValue();
}
return "";
}
public String TEXT(double number, String format) {
return new DecimalFormat(format).format(number);
}
public String TRIM(String text) {
return text.trim();
}
public String UPPER(String text) {
return text.toUpperCase();
}
}