diameter/lib/utils/utils.dart
2022-03-21 01:08:05 +01:00

93 lines
2.9 KiB
Dart

import 'dart:math';
import 'package:diameter/models/settings.dart';
class Utils {
// static double roundToDecimalPlaces(double value, int precision) {
// double mod = pow(10.0, precision).toDouble();
// return ((value * mod).round().toDouble() / mod);
// }
static double roundToMultipleOfBase(double value, double base) {
double result = value;
if (base != 0) {
double remainder = value % base;
int precision = Utils.getFractionDigitsLength(base);
if (remainder != 0) {
result = Utils.addDoublesWithPrecision(result, -remainder, precision);
if (remainder > (base / 2)) {
result = Utils.addDoublesWithPrecision(result, base, precision);
}
}
}
return result;
}
static double addDoublesWithPrecision(double a, double b, int precision) {
double mod = pow(10.0, precision).toDouble();
double difference = (a * mod) + (b * mod);
if (mod != 0) {
return difference.round() / mod;
}
return difference.round().toDouble();
}
static int getFractionDigitsLength(double value) {
final fractionDigits = value.toString().split('.');
return fractionDigits[1] == '0' ? 0 : fractionDigits[1].length;
}
static String toStringMatchingTemplateFractionPrecision(
double value, double template) {
final precision = getFractionDigitsLength(template);
return value.toStringAsFixed(precision);
}
static double convertMgPerDlToMmolPerL(int mgPerDl, {double step = 0.01}) {
return Utils.roundToMultipleOfBase(mgPerDl * 0.0555, step);
}
static int convertMmolPerLToMgPerDl(double mmolPerL) {
return (mmolPerL * 18.018).round();
}
static double calculateCarbs(double carbsRatio, double portionSize,
{double step = 0.01}) {
return Utils.roundToMultipleOfBase(carbsRatio * portionSize / 100, step);
}
static double calculateCarbsRatio(double carbsPerPortion, double portionSize,
{double step = 0.01}) {
return portionSize > 0
? Utils.roundToMultipleOfBase(carbsPerPortion * 100 / portionSize, step)
: 0;
}
static double calculatePortionSize(double carbsRatio, double carbsPerPortion,
{double step = 0.01}) {
return carbsRatio > 0
? Utils.roundToMultipleOfBase(carbsPerPortion * 100 / carbsRatio, step)
: 0;
}
static String displayGlucose({int? mgPerDl, double? mmolPerL}) {
return '${Settings.glucoseMeasurement == GlucoseMeasurement.mgPerDl ? (mgPerDl ?? '') : (mmolPerL ?? '')}';
}
static String displayGlucoseWithSuffix({int? mgPerDl, double? mmolPerL}) {
return '${Utils.displayGlucose(mgPerDl: mgPerDl, mmolPerL: mmolPerL)} ${Settings.glucoseMeasurementSuffix}';
}
static String displayNutritionAmount(double amount,
{bool cutExtraDigits = false}) {
final value = cutExtraDigits && Utils.getFractionDigitsLength(amount) == 0
? amount.toInt().toString()
: amount;
return '$value${Settings.nutritionMeasurementSuffix}';
}
}