294 lines
8.0 KiB
Dart
294 lines
8.0 KiB
Dart
import 'package:aman_kassa_flutter/core/models/calc_model.dart';
|
|
|
|
import 'number-formatter.dart';
|
|
|
|
class Calculations {
|
|
static const PERIOD = '.';
|
|
static const MULTIPLY = '*';
|
|
static const SUBTRACT = '-';
|
|
static const ADD = '+';
|
|
static const NONE = 'none';
|
|
|
|
static const ERASE = '<<';
|
|
static const CLEAR = 'C';
|
|
static const EQUAL = '=';
|
|
static const OPERATIONS = [
|
|
Calculations.ADD,
|
|
Calculations.MULTIPLY,
|
|
Calculations.SUBTRACT,
|
|
Calculations.ERASE
|
|
];
|
|
|
|
static double add(double a, double b) => a + b;
|
|
|
|
static double subtract(double a, double b) => a - b;
|
|
|
|
static double divide(double a, double b) => a / b;
|
|
|
|
static double multiply(double a, double b) => a * b;
|
|
}
|
|
|
|
class Calculator {
|
|
static String parseItems(List<CalcModel> items, bool isEqual) {
|
|
if (isEqual) {
|
|
return _viewResult(items);
|
|
} else {
|
|
return _viewValues(items);
|
|
}
|
|
}
|
|
|
|
static String _viewResult(List<CalcModel> items) {
|
|
String str = '';
|
|
if (items.isNotEmpty) {
|
|
CalcModel last = items.removeLast();
|
|
if (last.operation == Calculations.NONE && last.num1 != '0') {
|
|
last.operation = Calculations.ADD;
|
|
} else if (last.operation == Calculations.MULTIPLY) {
|
|
if (last.num2 == null) {
|
|
last.num2 = '1';
|
|
last.operation = Calculations.ADD;
|
|
}
|
|
}
|
|
last.closed = true;
|
|
items.add(last);
|
|
double summ = 0.0;
|
|
for (var i = 0; i < items.length; i++) {
|
|
var row = items[i];
|
|
if (row.operation == Calculations.MULTIPLY) {
|
|
str += "${row.num1} * ${row.num2}" ;
|
|
summ += double.parse(row.num1) * double.parse(row.num2);
|
|
} else {
|
|
str += row.num1;
|
|
summ += double.parse(row.num1) ;
|
|
}
|
|
|
|
if (row.closed) {
|
|
if (i < items.length - 1) {
|
|
str += " + ";
|
|
} else {
|
|
str += " = ";
|
|
}
|
|
}
|
|
}
|
|
|
|
str += summ.toStringAsFixed(2);
|
|
|
|
}
|
|
return str;
|
|
}
|
|
|
|
static String _viewValues(List<CalcModel> items) {
|
|
String str = '';
|
|
for (var i = 0; i < items.length; i++) {
|
|
CalcModel row = items[i];
|
|
if (row.operation == Calculations.ADD) {
|
|
str += row.num1;
|
|
} else if (row.operation == Calculations.MULTIPLY) {
|
|
if (row.num2 == null) {
|
|
str += row.num1 + " * ";
|
|
} else {
|
|
str += row.num1 + " * " + row.num2;
|
|
}
|
|
} else if (row.operation == Calculations.NONE) {
|
|
str += row.num1;
|
|
} else if (row.operation == Calculations.EQUAL) {
|
|
str += row.num1;
|
|
}
|
|
if (row.closed) {
|
|
str += " + ";
|
|
}
|
|
}
|
|
return str;
|
|
}
|
|
|
|
static List<CalcModel> action({String value, List<CalcModel> items}) {
|
|
switch (value) {
|
|
case Calculations.ADD:
|
|
{
|
|
items = _setPlus(value: value, items: items);
|
|
}
|
|
break;
|
|
case Calculations.MULTIPLY:
|
|
{
|
|
items = _setMultiply(value: value, items: items);
|
|
}
|
|
break;
|
|
case Calculations.ERASE:
|
|
{
|
|
items = _setBackward(value: value, items: items);
|
|
}
|
|
break;
|
|
case Calculations.CLEAR:
|
|
{
|
|
items = _setClean(value: value, items: items);
|
|
}
|
|
break;
|
|
case Calculations.PERIOD:
|
|
{
|
|
items = _setDot(value: value, items: items);
|
|
}
|
|
break;
|
|
case Calculations.EQUAL:
|
|
{
|
|
items = _setEqual(value: value, items: items);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
{
|
|
items = _setNumber(value: value, items: items);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return [...items];
|
|
}
|
|
|
|
static List<CalcModel> _setNumber({String value, List<CalcModel> items}) {
|
|
if (items.isEmpty) {
|
|
items.add(CalcModel(num1: value, operation: Calculations.NONE));
|
|
} else {
|
|
CalcModel last = items.removeLast();
|
|
if (last.closed) {
|
|
items.add(last);
|
|
items.add(CalcModel(num1: value, operation: Calculations.NONE));
|
|
} else {
|
|
if (value == '0' && last.num1 == '0') {
|
|
last.operation = Calculations.NONE;
|
|
items.add(last);
|
|
} else if (value == '0' && last.num1 == '0.') {
|
|
last.num1 += value;
|
|
last.operation = Calculations.NONE;
|
|
items.add(last);
|
|
} else {
|
|
if (last.operation == Calculations.NONE) {
|
|
if (last.num1 == '0' && value != '0') {
|
|
last.num1 = value;
|
|
} else {
|
|
last.num1 += value;
|
|
}
|
|
items.add(last);
|
|
} else if (last.operation == Calculations.MULTIPLY) {
|
|
if(last.num2 == null)
|
|
last.num2 = value;
|
|
else
|
|
last.num2 += value;
|
|
last.operation = Calculations.MULTIPLY;
|
|
items.add(last);
|
|
} else if (last.operation == Calculations.ADD) {
|
|
last.operation = Calculations.ADD;
|
|
items.add(last);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return [...items];
|
|
}
|
|
|
|
static List<CalcModel> _setPlus({String value, List<CalcModel> items}) {
|
|
if (items.isNotEmpty) {
|
|
CalcModel last = items.removeLast();
|
|
if (last.closed) {
|
|
items.add(last);
|
|
} else {
|
|
if (last.operation == Calculations.NONE) {
|
|
if (last.num1 != '0') {
|
|
last.num2 = '1';
|
|
last.operation = Calculations.ADD;
|
|
last.closed = true;
|
|
}
|
|
items.add(last);
|
|
} else if (last.operation == Calculations.MULTIPLY) {
|
|
if (last.num2 == null) {
|
|
last.num2 = '1';
|
|
last.operation = Calculations.ADD;
|
|
}
|
|
last.closed = true;
|
|
items.add(last);
|
|
} else {
|
|
last.closed = true;
|
|
items.add(last);
|
|
}
|
|
}
|
|
}
|
|
return [...items];
|
|
}
|
|
|
|
static List<CalcModel> _setDot({String value, List<CalcModel> items}) {
|
|
if (items.isNotEmpty) {
|
|
CalcModel last = items.removeLast();
|
|
if (last.operation == Calculations.NONE) {
|
|
if (last.num1?.contains('.') == false) {
|
|
last.num1 += '.';
|
|
}
|
|
last.operation = Calculations.NONE;
|
|
items.add(last);
|
|
} else if (last.operation == Calculations.ADD) {
|
|
items.add(last);
|
|
items.add(CalcModel(num1: '0.', operation: Calculations.NONE));
|
|
} else if (last.operation == Calculations.MULTIPLY) {
|
|
if (last.num2 == null) {
|
|
last.num2 += '0.';
|
|
} else {
|
|
if (last.num2?.contains('.') == false) {
|
|
last.num2 += '.';
|
|
}
|
|
}
|
|
last.operation = Calculations.MULTIPLY;
|
|
items.add(last);
|
|
}
|
|
} else {
|
|
items.add(CalcModel(num1: '0.', operation: Calculations.NONE));
|
|
}
|
|
return [...items];
|
|
}
|
|
|
|
static List<CalcModel> _setClean({String value, List<CalcModel> items}) {
|
|
return [];
|
|
}
|
|
|
|
static List<CalcModel> _setEqual({String value, List<CalcModel> items}) {
|
|
if (items.isNotEmpty) {
|
|
CalcModel last = items.removeLast();
|
|
last.operation = Calculations.EQUAL;
|
|
items.add(last);
|
|
}
|
|
return [...items];
|
|
}
|
|
|
|
static List<CalcModel> _setMultiply({String value, List<CalcModel> items}) {
|
|
if (items.isNotEmpty) {
|
|
CalcModel last = items.removeLast();
|
|
if (last.closed) {
|
|
if(last.operation == Calculations.ADD && last.num2 != null && last.num2 == '1') {
|
|
last.operation = Calculations.MULTIPLY;
|
|
last.num2 = null;
|
|
last.closed = false;
|
|
}
|
|
items.add(last);
|
|
} else {
|
|
if (last.operation == Calculations.NONE) {
|
|
if (last.num1 != null && last.num1 != '0') {
|
|
last.operation = Calculations.MULTIPLY;
|
|
last.num2 = null;
|
|
}
|
|
items.add(last);
|
|
} else if (last.operation == Calculations.MULTIPLY) {
|
|
if (last.num2!=null && last.num2 != '0') {
|
|
last.closed = true;
|
|
}
|
|
items.add(last);
|
|
}
|
|
}
|
|
}
|
|
return [...items];
|
|
}
|
|
|
|
static List<CalcModel> _setBackward({String value, List<CalcModel> items}) {
|
|
if (items.isNotEmpty) {
|
|
CalcModel last = items.removeLast();
|
|
}
|
|
return [...items];
|
|
}
|
|
}
|