/*
* VLCFormatter.java
*
*
*/
package org.smartly.packages.velocity.impl.vtools;
import org.json.JSONObject;
import org.smartly.commons.util.*;
import java.math.BigDecimal;
import java.text.DecimalFormatSymbols;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
/**
*
*/
public final class FmtTool
implements IVLCTool {
public static final java.lang.String NAME = "fmt";
// default locale
private static final Locale DEFAULT_LOCALE = Locale.US;
private static final java.lang.String DEFAULT_PATTERN = "#,##0.0###;(#,##0.0###)";
public FmtTool() {
}
@Override
public String getName() {
return NAME;
}
// --------------------------------------------------------------------
// S T R I N G
// --------------------------------------------------------------------
public String format(final Object text, final Object... args) {
if (null != text) {
return FormatUtils.format(text.toString(), args);
}
return "";
}
public String format(final Object text, final Object args) {
if (null != text) {
if (args instanceof Map) {
final Map map = (Map) args;
return FormatUtils.format(text.toString(), map);
} else if (args instanceof JsonWrapper){
final Map map = ((JsonWrapper) args).toMap();
return FormatUtils.format(text.toString(), map);
} else if (args instanceof JSONObject){
final Map map = JsonWrapper.toMap((JSONObject) args);
return FormatUtils.format(text.toString(), map);
} else if (args instanceof String && StringUtils.isJSON((String)args)){
final Map map = JsonWrapper.wrap((String)args).toMap((JSONObject) args);
return FormatUtils.format(text.toString(), map);
}
return FormatUtils.format(text.toString(), args);
}
return "";
}
// --------------------------------------------------------------------
// D A T E
// --------------------------------------------------------------------
public String formatDate(final Long date) {
final Date d = new Date(date);
return this.formatDate(d);
}
/**
* Return a localized date.
*
* @param inputDate date as string: e.g. 20120206
* @param inputDateFormat pattern: eg. yyyyMMdd
* @param locale language e.g. en-US, en_US, en
* @return
*/
public String formatDate(final String inputDate,
final String inputDateFormat,
final Locale locale) {
String result = null;
try {
if (null != inputDate && null != inputDateFormat) {
final DateWrapper dd = new DateWrapper();
dd.setDateTime(inputDate, inputDateFormat);
result = dd.toString(locale);
} else {
throw new Exception("Date and Format cannot be null.");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
public String formatDate(final Date date) {
String result = null;
try {
final DateWrapper dd = new DateWrapper();
if (null != date) {
dd.setDateTime(date);
result = dd.toString(DEFAULT_LOCALE);
} else {
throw new Exception("Date cannot be null.");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
public String formatDate(final Long date, final String dateFormat) {
final Date d = new Date(date);
return this.formatDate(d, dateFormat);
}
public String formatDate(final Date date, final String dateFormat) {
String result = null;
try {
final DateWrapper dd = new DateWrapper();
if (null != date) {
dd.setDateTime(date);
result = dd.toString(dateFormat);
} else {
throw new Exception("Date cannot be null.");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
public String formatDate(final Long date, final String dateFormat, final String lang) {
final Date d = new Date(date);
return this.formatDate(d, dateFormat, lang);
}
public String formatDate(final Date date, final String dateFormat, final String lang) {
String result = null;
try {
final DateWrapper dd = new DateWrapper();
final Locale locale = LocaleUtils.getLocaleFromString(lang);
if (null != date) {
dd.setDateTime(date);
if (StringUtils.hasText(dateFormat)) {
result = dd.toString(dateFormat, locale);
} else {
result = dd.toString(locale);
}
} else {
throw new Exception("Date cannot be null.");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
public String formatDate(final String inputDate,
final String inputDateFormat,
final String outputDateFormat) {
String result = null;
try {
final DateWrapper dd = new DateWrapper();
if (null != inputDate && null != inputDateFormat) {
dd.setDateTime(inputDate, inputDateFormat);
result = dd.toString(outputDateFormat);
} else {
throw new Exception("Date and Format cannot be null.");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
public String formatMonth(final Object month) {
return this.formatMonth(month, DEFAULT_LOCALE);
}
public String formatMonth(final Object month, final Object olocale) {
final int m = ConversionUtils.toInteger(month, 1);
final Locale locale = LocaleUtils.getLocaleFromObject(olocale, DEFAULT_LOCALE);
return this.formatMonth(m, locale);
}
public String formatNumber(final Object value, final String lang, final String country) {
final Locale locale = LocaleUtils.getLocale(new Locale(lang, country));
return formatNumber(value, locale);
}
/*
* Number Utility
*/
@SuppressWarnings({"unchecked"})
public String formatNumber(final Object value) {
String result = null;
String pattern = DEFAULT_PATTERN;
try {
final NumberWrapper dn = new NumberWrapper();
if (null != value) {
final Object n = this.getNumber(value, 0);
dn.setLocale(DEFAULT_LOCALE);
dn.setPattern(pattern);
dn.setValue(n);
result = dn.toString();
} else {
throw new Exception("Number cannot be null.");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
@SuppressWarnings({"unchecked"})
public String formatNumber(final Object value, final Locale locale) {
String result = null;
try {
final NumberWrapper dn = new NumberWrapper();
if (null != value) {
final Object n = this.getNumber(value, 0);
dn.setLocale(locale);
dn.setPattern(this.getNumberPattern(DEFAULT_PATTERN));
dn.setValue(n);
result = dn.toString();
} else {
throw new Exception("Number and Pattern cannot be null.");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
@SuppressWarnings({"unchecked"})
public String formatNumber(final Object value, final String pattern) {
return this.formatNumber(value, pattern, DEFAULT_LOCALE);
}
@SuppressWarnings({"unchecked"})
public String formatNumber(final Object value, final String pattern, final Locale locale) {
String result = null;
try {
final NumberWrapper dn = new NumberWrapper();
if (null != value) {
final Object n = this.getNumber(value, 0);
dn.setLocale(locale);
dn.setPattern(this.getNumberPattern(pattern));
dn.setValue(n);
result = dn.toString();
} else {
throw new Exception("Number and Pattern cannot be null.");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
public String formatCurrency(final Object value, final String lang, final String country) {
final Locale locale = LocaleUtils.getLocale(lang, country);
return formatCurrency(value, locale);
}
public String formatCurrency(final Object value, final String lang, final String country,
final boolean includesymbol) {
final Locale locale = LocaleUtils.getLocale(lang, country);
return formatCurrency(value, locale, includesymbol);
}
public String formatCurrency(final Object value, final Locale locale) {
return this.formatCurrency(value, locale, false);
}
public String formatCurrency(final Object value, final Locale locale,
final boolean includesymbol) {
String result = null;
try {
final DecimalFormatSymbols dfs = LocaleUtils.getDecimalFormatSymbols(locale);
final int dec = dfs.getCurrency().getDefaultFractionDigits();
final double ivalue = ConversionUtils.toDouble(value, dec);
final String pattern = this.getCurrencyPattern(dfs, includesymbol);
result = this.formatNumber(ivalue, pattern, locale);
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
public String formatPercent(final Object value) {
String result = "";
try {
double dvalue = ConversionUtils.toDouble(value, 2);
if (dvalue < 1) {
dvalue *= 100;
}
result = (int) dvalue + "%";
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
public String formatHtml(final String value) {
String result = null;
try {
if (StringUtils.hasText(value)) {
result = value.replaceAll("\n", "<br>");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return null != result ? result : "";
}
/**
* Bring text to Upper Case
*
* @param text Some text (for example: "hello")
* @return Upper Case text, i.e. "HELLO"
*/
public String upper(final String text) {
return StringUtils.hasText(text) ? text.toUpperCase() : "";
}
/**
* Bring text to Lower Case
*
* @param text Some text (for example: "HELLO")
* @return Lower Case text, i.e. "hello"
*/
public String lower(final String text) {
return StringUtils.hasText(text) ? text.toLowerCase() : "";
}
/**
* Trunc text and return text with ellipsis.<br/>
* i.e. trunc("Hello world", 5) returns "Hello..."
*
* @param text Text to trunc
* @param length max length for text.
* @return Truncated text with ellipsis
*/
public String trunc(final String text, final int length) {
return StringUtils.leftStr(text, length, true);
}
// ------------------------------------------------------------------------
// p r i v a t e
// ------------------------------------------------------------------------
private Object getNumber(final Object value,
final Object defaultValue) throws Exception {
if (null == value) {
return defaultValue;
}
String strValue = value.toString();
try {
return new BigDecimal(strValue);
} catch (NumberFormatException ex) {
throw new Exception("Number Format Exception, '" + strValue + "' is not a number.");
}
}
private String getNumberPattern(final String pattern) {
// pattern "n,nn0.nn;(n,nn0.nn)" become "#,##0.##;(#,##0.##)"
return pattern.replace('n', '#');
}
private String getCurrencyPattern(final DecimalFormatSymbols dfs, final boolean includesymbol) {
// "#,##0.##;(#,##0.##)"
final String symbol = dfs.getCurrency().getSymbol();
final int dec = dfs.getCurrency().getDefaultFractionDigits();
final char decsep = '.';
final char grpsep = ',';//dfs.getGroupingSeparator();
final char digit = '#'; // dfs.getDigit();
final StringBuilder sb = new StringBuilder();
// positive
if (includesymbol) {
sb.append(symbol);
}
sb.append(digit).append(grpsep).append(digit).append(digit).append("0"); // #,##0
if (dec > 0) {
sb.append(decsep);
for (int i = 0; i < dec; i++) {
sb.append("0");
}
}
// negative
sb.append("; ").append("(");
if (includesymbol) {
sb.append(symbol);
}
sb.append(digit).append(grpsep).append(digit).append(digit).append("0"); // #,##0
if (dec > 0) {
sb.append(decsep);
for (int i = 0; i < dec; i++) {
sb.append("0");
}
}
sb.append(")");
return sb.toString();
}
private String formatMonth(final int month, final Locale locale) {
String result = null;
try {
final DateWrapper dd = new DateWrapper();
if (month > 0) {
dd.setMonth(month);
result = dd.toString("MMMM", locale);
} else {
throw new Exception("Month cannot be zero (allowed 1-12).");
}
} catch (Exception ex) {
result = "Error: [" + ex.getMessage() + "]";
}
return result;
}
}