mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-06-27 08:29:31 +00:00
call calculate()
This commit is contained in:
parent
b87609c9d0
commit
d037cc1d97
|
@ -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
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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 ();
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user