Preparo para fórmulas que devuelven cadenas
This commit is contained in:
parent
82d29022a6
commit
26ad07d076
3 changed files with 53 additions and 34 deletions
25
.metadata
25
.metadata
|
|
@ -4,7 +4,7 @@
|
|||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: "077b4a4ce10a07b82caa6897f0c626f9c0a3ac90"
|
||||
revision: "05db9689081f091050f01aed79f04dce0c750154"
|
||||
channel: "stable"
|
||||
|
||||
project_type: app
|
||||
|
|
@ -13,26 +13,11 @@ project_type: app
|
|||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
- platform: android
|
||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
- platform: ios
|
||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
- platform: linux
|
||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
- platform: macos
|
||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
create_revision: 05db9689081f091050f01aed79f04dce0c750154
|
||||
base_revision: 05db9689081f091050f01aed79f04dce0c750154
|
||||
- platform: web
|
||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
- platform: windows
|
||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
||||
create_revision: 05db9689081f091050f01aed79f04dce0c750154
|
||||
base_revision: 05db9689081f091050f01aed79f04dce0c750154
|
||||
|
||||
# User provided section
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ class D4rtEditingController extends TextEditingController {
|
|||
String? _lastError;
|
||||
|
||||
String? get lastError => _lastError;
|
||||
Number? _lastValue;
|
||||
FormulaResult? _lastValue;
|
||||
|
||||
D4rtEditingController({String? text}) : super(text: text);
|
||||
|
||||
|
|
@ -36,8 +36,10 @@ class D4rtEditingController extends TextEditingController {
|
|||
_lastValue = FormulaEvaluator.evaluateExpression(text);
|
||||
_lastError = null;
|
||||
return true;
|
||||
} catch (e) {
|
||||
} catch (e, s) {
|
||||
_lastError = e.toString();
|
||||
print( "validate: $text: $e" );
|
||||
print( "stack: $s" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -98,15 +100,24 @@ class _FormulaScreenState extends State<FormulaScreen> {
|
|||
if( controller.d4rtValue == null ){
|
||||
throw FormulaEvaluationException( "Field ${input.name} is invalid" );
|
||||
}
|
||||
final value = controller.d4rtValue;
|
||||
final value = controller.d4rtValue.value;
|
||||
|
||||
// Convert input to base unit if needed
|
||||
// Always convert from dropdown unit to variable's base unit
|
||||
inputValues[input.name] = widget.corpus.convert(
|
||||
value,
|
||||
_selectedUnits[input.name]!,
|
||||
input.unit,
|
||||
);
|
||||
late final convertedValue;
|
||||
if( value is Number ) {
|
||||
convertedValue = widget.corpus.convert(
|
||||
value,
|
||||
_selectedUnits[input.name]!,
|
||||
input.unit,
|
||||
);
|
||||
}
|
||||
else{
|
||||
convertedValue = value;
|
||||
}
|
||||
|
||||
inputValues[input.name] = convertedValue;
|
||||
|
||||
}
|
||||
|
||||
final evaluator = FormulaEvaluator();
|
||||
|
|
|
|||
|
|
@ -25,6 +25,20 @@ class MyMath{
|
|||
static Number myPow(Number b, Number e) => Math.pow(b,e) as Number;
|
||||
}
|
||||
|
||||
class FormulaResult{
|
||||
const FormulaResult();
|
||||
}
|
||||
|
||||
class StringResult extends FormulaResult{
|
||||
final String value;
|
||||
const StringResult(this.value);
|
||||
}
|
||||
|
||||
class NumberResult extends FormulaResult{
|
||||
final Number value;
|
||||
const NumberResult(this.value);
|
||||
}
|
||||
|
||||
class FormulaEvaluator {
|
||||
final D4rt _interpreter;
|
||||
|
||||
|
|
@ -34,7 +48,7 @@ class FormulaEvaluator {
|
|||
prepareInterpreter(_interpreter);
|
||||
}
|
||||
|
||||
static Number getNumberValueOf(String s){
|
||||
static Number _getNumberValueOf(String s){
|
||||
return double.parse(s);
|
||||
}
|
||||
|
||||
|
|
@ -44,12 +58,12 @@ class FormulaEvaluator {
|
|||
name: 'MyMath',
|
||||
staticMethods: {
|
||||
'myPow': (visitor, positionalArgs, namedArgs) {
|
||||
final Number base = getNumberValueOf( positionalArgs[0].toString() );
|
||||
final Number exp = getNumberValueOf( positionalArgs[1].toString() );
|
||||
final Number base = _getNumberValueOf( positionalArgs[0].toString() );
|
||||
final Number exp = _getNumberValueOf( positionalArgs[1].toString() );
|
||||
return MyMath.myPow(base,exp);
|
||||
},
|
||||
'myLog': (visitor, positionalArgs, namedArgs) {
|
||||
final Number x = getNumberValueOf( positionalArgs[0].toString() );
|
||||
final Number x = _getNumberValueOf( positionalArgs[0].toString() );
|
||||
return MyMath.myLog(x);
|
||||
},
|
||||
}
|
||||
|
|
@ -58,7 +72,7 @@ class FormulaEvaluator {
|
|||
interpreter.registerBridgedClass(myMathDefinition, "package:d4rt_formulas.dart");
|
||||
}
|
||||
|
||||
static dynamic evaluateExpression(String code, [D4rt? interpreter]) {
|
||||
static FormulaResult evaluateExpression(String code, [D4rt? interpreter]) {
|
||||
final d4rtInterpreter = interpreter ?? createDefaultInterpreter();
|
||||
prepareInterpreter(d4rtInterpreter);
|
||||
final d4rtCode = """
|
||||
|
|
@ -71,7 +85,16 @@ class FormulaEvaluator {
|
|||
}""";
|
||||
//print("evaluateExpression:\n$d4rtCode");
|
||||
final result = d4rtInterpreter.execute(source: d4rtCode);
|
||||
return result.toDouble();
|
||||
switch ( result ){
|
||||
case int value:
|
||||
return NumberResult(value.toDouble());
|
||||
case Number value:
|
||||
return NumberResult(value);
|
||||
case String value:
|
||||
return StringResult(value);
|
||||
default:
|
||||
throw FormulaEvaluationException( "Unexpected result type: ${result.runtimeType} -- $result" );
|
||||
}
|
||||
}
|
||||
|
||||
dynamic evaluate(Formula formula, Map<String, dynamic> inputValues) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue