All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.anysoft.formula.ExprValue Maven / Gradle / Ivy

There is a newer version: 1.6.17
Show newest version
package com.anysoft.formula;

import java.util.Date;

/**
 * Value of Expression
 * 
 *  ExprValue supports five basic data types:long,string,double,boolean,date.
 * @author duanyy
 * @version 1.0.0 
 * @version 1.6.4.21 [20160103 duanyy] 
* - 根据sonar建议优化代码
* * @version 1.6.4.22 [20170324 duanyy]
* - 修正公式解析器中double值的比较问题
*/ public class ExprValue implements Comparable{ /** * value */ protected Object value = null; /** * data type of the value */ protected DataType dataType = DataType.Void; /** * constructor */ public ExprValue(){ // nothing to do } /** * constructor * @param longValue long value */ public ExprValue(long longValue){ setLong(longValue); } /** * constructor * @param stringValue string value */ public ExprValue(String stringValue){ setString(stringValue); } /** * constructor * @param dateValue data value */ public ExprValue(Date dateValue){ setDate(dateValue); } public ExprValue(boolean boolValue){ setBoolean(boolValue); } public ExprValue(double doubleValue){ setDouble(doubleValue); } /** * to get data type of the value * @return data type of the value */ public DataType getDataType(){return dataType;} public ExprValue setLong(long longValue){ value = Long.valueOf(longValue); dataType = DataType.Long; return this; } public ExprValue setDouble(double doubleValue) { value = Double.valueOf(doubleValue); dataType = DataType.Double; return this; } public ExprValue setBoolean(boolean boolValue) { value = Boolean.valueOf(boolValue); dataType = DataType.Boolean; return this; } public ExprValue setDate(Date dateValue) { value = dateValue; dataType = DataType.Date; return this; } public ExprValue setString(String stringValue) { value = stringValue; dataType = DataType.String; return this; } /** * get long value from ExprValue * @return long value of the expr value * @throws FormulaException en excption when data type is mismatched */ public long getLong(){ switch (dataType){ case Long:return ((Long)value).longValue(); case Double:return ((Double)value).longValue(); default: } throw new FormulaException("Can not get a long value from " + dataType.toString()); } public int getInt(){ return (int)getLong(); } /** * get double value from ExprValue * @return double value * @throws FormulaException en excption when data type is mismatched */ public double getDouble(){ switch (dataType) { case Long: return ((Long) value).doubleValue(); case Double: return ((Double) value).doubleValue(); default: } throw new FormulaException("Can not get a double value from " + dataType.toString()); } public float getFloat(){ return (float)getDouble(); } /** * get string value from ExprValue * @return double value * @throws FormulaException */ public String getString(){ return value.toString(); } @Override public String toString(){ return value.toString(); } /** * get boolean value from ExprValue * @return boolean value * @throws FormulaException en excption when data type is mismatched */ public boolean getBoolean(){ switch (dataType){ case Long: return ((Long) value).longValue() != 0; case Boolean: return ((Boolean) value).booleanValue(); default: } throw new FormulaException("Can not get a boolean value from " + dataType.toString()); } /** * get date value from ExprValue * @return date value * @throws FormulaException en excption when data type is mismatched */ public Date getDate(){ if (dataType == DataType.Date){ return (Date)value; } throw new FormulaException("Can not get a date value from " + dataType.toString()); } /** * add * @param other anonther ExprValue * @return ExprValue * @throws FormulaException en excption when data type is mismatched */ public ExprValue add(ExprValue other){ // NOSONAR switch (dataType){ case Long:// NOSONAR if (other.dataType == DataType.Long){ setLong(getLong() + other.getLong()); return this; }else{ if (other.dataType == DataType.Double){ setDouble(getLong() + other.getDouble()); return this; } } break; case Double: if (other.dataType == DataType.Long || other.dataType == DataType.Double){ setDouble(getDouble() + other.getDouble()); return this; } break; case String: setString(getString() + other.getString()); return this; default: } throw new FormulaException("Can not add value between " + dataType.toString() + " and " + other.dataType.toString()); // NOSONAR } /** * sub * @param other another ExprValue * @return ExprValue * @throws FormulaException */ public ExprValue sub(ExprValue other){ // NOSONAR switch (dataType){ case Long:// NOSONAR if (other.dataType == DataType.Long){ setLong(getLong() - other.getLong()); return this; }else{ if (other.dataType == DataType.Double){ setDouble(getLong() - other.getDouble()); return this; } } break; case Double: if (other.dataType == DataType.Long || other.dataType == DataType.Double){ setDouble(getDouble() - other.getDouble()); return this; } break; default: } throw new FormulaException("Can not sub value between " + dataType.toString() + " and " + other.dataType.toString()); } /** * mul * @param other anther ExprValue * @return ExprValue * @throws FormulaException */ public ExprValue mul(ExprValue other){ // NOSONAR switch (dataType){ case Long: // NOSONAR if (other.dataType == DataType.Long){ setLong(getLong() * other.getLong()); return this; }else{ if (other.dataType == DataType.Double){ setDouble(getLong() * other.getDouble()); return this; } } break; case Double: if (other.dataType == DataType.Long || other.dataType == DataType.Double){ setDouble(getDouble() * other.getDouble()); return this; } break; default: } throw new FormulaException("Can not mul value between " + dataType.toString() + " and " + other.dataType.toString()); } /** * div * @param other anther ExprValue * @return ExprValue * @throws FormulaException */ public ExprValue div(ExprValue other){ // NOSONAR switch (dataType){ case Long: // NOSONAR if (other.dataType == DataType.Long){ if (other.getLong() == 0) throw new FormulaException("divided by zero"); // NOSONAR setLong(getLong() / other.getLong()); return this; }else{ if (other.dataType == DataType.Double){ if (other.getDouble() == 0) // NOSONAR throw new FormulaException("divided by zero"); setDouble(getLong() / other.getDouble()); return this; } } break; case Double: // NOSONAR if (other.dataType == DataType.Long || other.dataType == DataType.Double){ if (other.getDouble() == 0) // NOSONAR throw new FormulaException("divided by zero"); setDouble(getDouble() / other.getDouble()); return this; } break; default: } throw new FormulaException("Can not div value between " + dataType.toString() + " and " + other.dataType.toString()); } /** * mod * @param other anther ExprValue * @return ExprValue * @throws FormulaException */ public ExprValue mod(ExprValue other){ switch (dataType){ // NOSONAR case Long: if (other.dataType == DataType.Long){ setLong(getLong() % other.getLong()); return this; } default: } throw new FormulaException("Can not mod value between " + dataType.toString() + " and " + other.dataType.toString()); } /** * get value * @return value of the ExprValue */ public Object getValue(){return value;} /** * Data type * @author duanyy * @version 1.0.0 */ public enum DataType {Long,String,Date,Boolean,Double,Void} // NOSONAR @Override public int compareTo(ExprValue other) { // NOSONAR switch (dataType){ case String: if (other.dataType == DataType.String){ return value.toString().compareTo(other.value.toString()); } break; case Boolean: if (other.dataType == DataType.Boolean){ return ((Boolean)value).compareTo((Boolean)other.value); } break; case Date: if (other.dataType == DataType.Date){ return ((Date)value).compareTo((Date)other.value); } break; case Long: // NOSONAR switch (other.dataType){ case Long: return ((Long)value).compareTo((Long)other.value); case Double: // NOSONAR if (getLong() > other.getDouble()){ return 1; }else{ return other.getDouble() > getLong() ? -1 : 0; } default: } break; case Double: // NOSONAR switch (other.dataType){ case Double: return ((Double)value).compareTo((Double)other.value); case Long: // NOSONAR boolean compare = getDouble() > other.getLong(); if (compare){ return 1; }else{ return getDouble() < other.getLong() ? -1 : 0; } default: } default: break; } throw new FormulaException("Can not compare between " + dataType.toString() + " and " + other.dataType.toString()); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy