call calculate()

This commit is contained in:
Denis Molony 2016-03-17 06:32:25 +11:00
parent b87609c9d0
commit d037cc1d97
15 changed files with 144 additions and 72 deletions

View File

@ -18,6 +18,7 @@ class Cell implements Comparable<Cell>, Value
private String expressionText; private String expressionText;
private Value value; private Value value;
private ValueType valueType;
enum CellType enum CellType
{ {
@ -181,6 +182,12 @@ class Cell implements Comparable<Cell>, Value
return value.getValue (); return value.getValue ();
} }
@Override
public ValueType getValueType ()
{
return valueType;
}
@Override @Override
public String getText () public String getText ()
{ {
@ -210,12 +217,15 @@ class Cell implements Comparable<Cell>, Value
{ {
System.out.printf ("%s null expression text %n", address); System.out.printf ("%s null expression text %n", address);
value = Function.getInstance (parent, "@ERROR"); value = Function.getInstance (parent, "@ERROR");
valueType = ValueType.ERROR;
} }
else else
{
// should use Number or Cell for simple Values // should use Number or Cell for simple Values
value = new Expression (parent, expressionText); value = new Expression (parent, expressionText);
value.calculate ();
value.calculate (); valueType = value.getValueType ();
}
} }
@Override @Override

View File

@ -49,8 +49,14 @@ class Condition
{ {
conditionExpression = new Expression (parent, conditionText); conditionExpression = new Expression (parent, conditionText);
valueExpression = new Expression (parent, valueText); valueExpression = new Expression (parent, valueText);
conditionExpression.calculate ();
valueExpression.calculate ();
} }
if (conditionExpression.isError () || valueExpression.isError ())
return false;
double conditionResult = conditionExpression.getValue (); double conditionResult = conditionExpression.getValue ();
double valueResult = valueExpression.getValue (); double valueResult = valueExpression.getValue ();

View File

@ -19,7 +19,7 @@ class Count extends Function
Cell cell = parent.getCell (address); Cell cell = parent.getCell (address);
if (cell == null || cell.isError () || cell.isNaN ()) if (cell == null || cell.isError () || cell.isNaN ())
{ {
isError = true; valueType = ValueType.ERROR;
break; break;
} }

View File

@ -32,7 +32,8 @@ class Expression implements Value
private final List<String> operators = new ArrayList<String> (); private final List<String> operators = new ArrayList<String> ();
private final List<String> signs = new ArrayList<String> (); private final List<String> signs = new ArrayList<String> ();
protected boolean isError; // protected boolean isError;
private ValueType valueType;
private double value; private double value;
public Expression (Sheet parent, String text) public Expression (Sheet parent, String text)
@ -118,34 +119,60 @@ class Expression implements Value
@Override @Override
public void calculate () public void calculate ()
{ {
Value thisValue = values.get (0); try
value = thisValue == null ? 0 : values.get (0).getValue ();
String sign = signs.get (0);
if (sign.equals ("(-)"))
value *= -1;
for (int i = 1; i < values.size (); i++)
{ {
thisValue = values.get (i); Value thisValue = values.get (0);
double nextValue = thisValue == null ? 0 : thisValue.getValue (); thisValue.calculate ();
if (thisValue.isError ())
{
valueType = ValueType.ERROR;
return;
}
value = thisValue.getValue ();
sign = signs.get (i); String sign = signs.get (0);
if (sign.equals ("(-)")) if (sign.equals ("(-)"))
nextValue *= -1; value *= -1;
String operator = operators.get (i - 1); for (int i = 1; i < values.size (); i++)
if (operator.equals ("+")) {
value += nextValue; thisValue = values.get (i);
else if (operator.equals ("-")) thisValue.calculate ();
value -= nextValue; if (thisValue.isError ())
else if (operator.equals ("*")) {
value *= nextValue; valueType = ValueType.ERROR;
else if (operator.equals ("/")) return;
value /= nextValue; }
else if (operator.equals ("^")) double nextValue = thisValue.getValue ();
value = Math.pow (value, nextValue);
sign = signs.get (i);
if (sign.equals ("(-)"))
nextValue *= -1;
String operator = operators.get (i - 1);
if (operator.equals ("+"))
value += nextValue;
else if (operator.equals ("-"))
value -= nextValue;
else if (operator.equals ("*"))
value *= nextValue;
else if (operator.equals ("/"))
value /= nextValue;
else if (operator.equals ("^"))
value = Math.pow (value, nextValue);
}
valueType = ValueType.VALUE;
} }
catch (Exception e)
{
valueType = ValueType.ERROR;
}
}
@Override
public ValueType getValueType ()
{
return valueType;
} }
@Override @Override
@ -157,22 +184,19 @@ class Expression implements Value
@Override @Override
public String getText () public String getText ()
{ {
if (isNaN ()) return isNaN () ? "NaN" : isError () ? "Error" : "";
return "NaN";
if (isError ())
return "Error";
return "";
} }
@Override @Override
public boolean isError () public boolean isError ()
{ {
return isError; return valueType == ValueType.ERROR;
} }
@Override @Override
public double getValue () public double getValue ()
{ {
assert valueType == ValueType.VALUE : "Expression ValueType = " + valueType;
return value; return value;
} }

View File

@ -33,7 +33,7 @@ abstract class Function implements Value
protected final Sheet parent; protected final Sheet parent;
protected String functionText; protected String functionText;
protected boolean isError; protected ValueType valueType;
protected double value; protected double value;
static Function getInstance (Sheet parent, String text) static Function getInstance (Sheet parent, String text)
@ -102,10 +102,16 @@ abstract class Function implements Value
functionText = ""; functionText = "";
} }
@Override
public ValueType getValueType ()
{
return valueType;
}
@Override @Override
public boolean isError () public boolean isError ()
{ {
return isError; return valueType == ValueType.ERROR;
} }
@Override @Override
@ -117,17 +123,14 @@ abstract class Function implements Value
@Override @Override
public double getValue () public double getValue ()
{ {
assert valueType == ValueType.VALUE : "Function ValueType = " + valueType;
return value; return value;
} }
@Override @Override
public String getText () public String getText ()
{ {
if (isNaN ()) return isNaN () ? "NaN" : isError () ? "Error" : "";
return "NaN";
if (isError ())
return "Error";
return "";
} }
protected Range getRange (String text) protected Range getRange (String text)

View File

@ -25,17 +25,31 @@ class If extends Function
@Override @Override
public void calculate () public void calculate ()
{ {
valueType = ValueType.VALUE;
if (condition.getResult ()) if (condition.getResult ())
{ {
if (expTrue == null) if (expTrue == null)
{
expTrue = new Expression (parent, textTrue); expTrue = new Expression (parent, textTrue);
value = expTrue.getValue (); expTrue.calculate ();
}
if (expTrue.isError () || expTrue.isNaN ())
valueType = expTrue.getValueType ();
else
value = expTrue.getValue ();
} }
else else
{ {
if (expFalse == null) if (expFalse == null)
{
expFalse = new Expression (parent, textFalse); expFalse = new Expression (parent, textFalse);
value = expFalse.getValue (); expFalse.calculate ();
}
if (expFalse.isError () || expFalse.isNaN ())
valueType = expFalse.getValueType ();
else
value = expFalse.getValue ();
} }
} }

View File

@ -13,7 +13,9 @@ class IsError extends Function
@Override @Override
public void calculate () public void calculate ()
{ {
value = expression.getValue (); expression.calculate ();
isError = expression.isError (); // value = expression.getValue ();
valueType = expression.getValueType ();
value = isError () ? 1 : 0;
} }
} }

View File

@ -14,6 +14,6 @@ public class IsNa extends Function
public void calculate () public void calculate ()
{ {
value = expression.getValue (); value = expression.getValue ();
isError = expression.isError (); valueType = expression.getValueType ();
} }
} }

View File

@ -3,7 +3,6 @@ package com.bytezone.diskbrowser.visicalc;
class Lookup extends Function class Lookup extends Function
{ {
Range range; Range range;
// boolean hasValue;
String sourceText; String sourceText;
String rangeText; String rangeText;
Expression source; Expression source;
@ -20,15 +19,15 @@ class Lookup extends Function
range = getRange (rangeText); range = getRange (rangeText);
} }
// need a mechanism to return NA and ERROR @Override
// @Override
// public boolean hasValue ()
// {
// return hasValue;
// }
public void calculate () public void calculate ()
{ {
source.calculate ();
if (source.isError () || source.isNaN ())
{
valueType = source.getValueType ();
return;
}
double sourceValue = source.getValue (); double sourceValue = source.getValue ();
Address target = null; Address target = null;
@ -45,7 +44,5 @@ class Lookup extends Function
value = parent.getCell (target.nextColumn ()).getValue (); value = parent.getCell (target.nextColumn ()).getValue ();
else else
value = parent.getCell (target.nextRow ()).getValue (); value = parent.getCell (target.nextRow ()).getValue ();
// return 0;
} }
} }

View File

@ -14,7 +14,6 @@ class Max extends Function
public void calculate () public void calculate ()
{ {
value = Double.MIN_VALUE; value = Double.MIN_VALUE;
isError = false;
int totalChecked = 0; int totalChecked = 0;
for (Address address : range) for (Address address : range)
@ -25,8 +24,8 @@ class Max extends Function
if (cell.isError () || cell.isNaN ()) if (cell.isError () || cell.isNaN ())
{ {
isError = true; valueType = ValueType.ERROR;
break; return;
} }
double temp = cell.getValue (); double temp = cell.getValue ();
@ -36,6 +35,8 @@ class Max extends Function
} }
if (totalChecked == 0) if (totalChecked == 0)
isError = true; valueType = ValueType.ERROR;
else
valueType = ValueType.VALUE;
} }
} }

View File

@ -14,7 +14,6 @@ class Min extends Function
public void calculate () public void calculate ()
{ {
value = Double.MAX_VALUE; value = Double.MAX_VALUE;
isError = false;
int totalChecked = 0; int totalChecked = 0;
for (Address address : range) for (Address address : range)
@ -25,8 +24,8 @@ class Min extends Function
if (cell.isError () || cell.isNaN ()) if (cell.isError () || cell.isNaN ())
{ {
isError = true; valueType = ValueType.ERROR;
break; return;
} }
double temp = cell.getValue (); double temp = cell.getValue ();
@ -36,6 +35,8 @@ class Min extends Function
} }
if (totalChecked == 0) if (totalChecked == 0)
isError = true; valueType = ValueType.ERROR;
else
valueType = ValueType.VALUE;
} }
} }

View File

@ -24,6 +24,7 @@ public class Npv extends Function
public void calculate () public void calculate ()
{ {
value = 0; value = 0;
valueType = ValueType.VALUE;
for (Address address : range) for (Address address : range)
{ {
@ -33,8 +34,8 @@ public class Npv extends Function
if (cell.isError () || cell.isNaN ()) if (cell.isError () || cell.isNaN ())
{ {
isError = true; valueType = ValueType.VALUE;
break; return;
} }
double temp = cell.getValue (); double temp = cell.getValue ();

View File

@ -2,8 +2,8 @@ package com.bytezone.diskbrowser.visicalc;
class Number implements Value class Number implements Value
{ {
double value; private double value;
boolean isError; private ValueType valueType;
public Number (String text) public Number (String text)
{ {
@ -13,14 +13,14 @@ class Number implements Value
} }
catch (NumberFormatException e) catch (NumberFormatException e)
{ {
isError = true; valueType = ValueType.ERROR;
} }
} }
@Override @Override
public boolean isError () public boolean isError ()
{ {
return isError; return valueType == ValueType.ERROR;
} }
@Override @Override
@ -51,4 +51,10 @@ class Number implements Value
public void calculate () public void calculate ()
{ {
} }
@Override
public ValueType getValueType ()
{
return null;
}
} }

View File

@ -14,6 +14,8 @@ class Sum extends Function
public void calculate () public void calculate ()
{ {
value = 0; value = 0;
valueType = ValueType.VALUE;
for (Address address : range) for (Address address : range)
{ {
Cell cell = parent.getCell (address); Cell cell = parent.getCell (address);
@ -22,8 +24,8 @@ class Sum extends Function
if (cell.isError () || cell.isNaN ()) if (cell.isError () || cell.isNaN ())
{ {
isError = true; valueType = ValueType.ERROR;
break; return;
} }
value += cell.getValue (); value += cell.getValue ();
} }

View File

@ -2,7 +2,12 @@ package com.bytezone.diskbrowser.visicalc;
interface Value interface Value
{ {
// public boolean hasValue (); enum ValueType
{
VALUE, ERROR, NA
}
public ValueType getValueType ();
public double getValue (); public double getValue ();