From 83030f6aea9c0f86bc82f0c9d1eb62f9b9a9aa59 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Sat, 9 Jan 2016 18:02:17 +0100 Subject: [PATCH] Fix zsum computation ( #335 ) --- src/sakia/core/money/quant_zerosum.py | 14 +++++++----- src/sakia/core/money/quantitative.py | 18 ++++++++++------ src/sakia/core/money/relative.py | 18 ++++++++++------ src/sakia/core/money/relative_zerosum.py | 27 +++++++++++++++--------- 4 files changed, 49 insertions(+), 28 deletions(-) diff --git a/src/sakia/core/money/quant_zerosum.py b/src/sakia/core/money/quant_zerosum.py index 9bb7e211..a27bdbf9 100644 --- a/src/sakia/core/money/quant_zerosum.py +++ b/src/sakia/core/money/quant_zerosum.py @@ -33,13 +33,13 @@ class QuantitativeZSum: :param sakia.core.community.Community community: Community instance :return: int """ - ud_block = yield from self.community.get_ud_block() - if ud_block and ud_block['membersCount'] > 0: + current = yield from self.community.get_block() + if current and current['membersCount'] > 0: monetary_mass = yield from self.community.monetary_mass() - average = monetary_mass / ud_block['membersCount'] + average = monetary_mass / current['membersCount'] else: average = 0 - return self.amount - average + return self.amount - monetary_mass @asyncio.coroutine def differential(self): @@ -50,7 +50,11 @@ class QuantitativeZSum: def localized(self, units=False, international_system=False): value = yield from self.value() - localized_value = QLocale().toString(float(value), 'f', 0) + prefix = "" + if international_system: + localized_value, prefix = Quantitative.to_si(value, self.app.preferences['digits_after_comma']) + else: + localized_value = QLocale().toString(float(value), 'f', 0) if units: return QCoreApplication.translate("QuantitativeZSum", diff --git a/src/sakia/core/money/quantitative.py b/src/sakia/core/money/quantitative.py index e0072fbf..4ac9024f 100644 --- a/src/sakia/core/money/quantitative.py +++ b/src/sakia/core/money/quantitative.py @@ -39,8 +39,15 @@ class Quantitative(): value = yield from self.value() return value - def _to_si(self, value): + @staticmethod + def to_si(value, digits): prefixes = ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'z', 'y'] + if value < 0: + value = -value + multiplier = -1 + else: + multiplier = 1 + scientific_value = value prefix_index = 0 prefix = "" @@ -51,10 +58,9 @@ class Quantitative(): if prefix_index < len(prefixes): prefix = prefixes[prefix_index] - localized_value = QLocale().toString(float(scientific_value), 'f', - self.app.preferences['digits_after_comma']) + localized_value = QLocale().toString(float(scientific_value * multiplier), 'f', digits) else: - localized_value = QLocale().toString(float(value), 'f', 0) + localized_value = QLocale().toString(float(value * multiplier), 'f', 0) return localized_value, prefix @@ -63,7 +69,7 @@ class Quantitative(): value = yield from self.value() prefix = "" if international_system: - localized_value, prefix = self._to_si(value) + localized_value, prefix = Quantitative.to_si(value, self.app.preferences['digits_after_comma']) else: localized_value = QLocale().toString(float(value), 'f', 0) @@ -81,7 +87,7 @@ class Quantitative(): value = yield from self.differential() prefix = "" if international_system: - localized_value, prefix = self._to_si(value) + localized_value, prefix = Quantitative.to_si(value, self.app.preferences['digits_after_comma']) else: localized_value = QLocale().toString(float(value), 'f', 0) diff --git a/src/sakia/core/money/relative.py b/src/sakia/core/money/relative.py index 30d83ff4..171a09fe 100644 --- a/src/sakia/core/money/relative.py +++ b/src/sakia/core/money/relative.py @@ -42,8 +42,14 @@ class Relative(): value = yield from self.value() return value - def _to_si(self, value): + @staticmethod + def to_si(value, digits): prefixes = ['', 'd', 'c', 'm', 'µ', 'n', 'p', 'f', 'a', 'z', 'y'] + if value < 0: + value = -value + multiplier = -1 + else: + multiplier = 1 scientific_value = value prefix_index = 0 prefix = "" @@ -57,11 +63,9 @@ class Relative(): if prefix_index < len(prefixes): prefix = prefixes[prefix_index] - localized_value = QLocale().toString(float(scientific_value), 'f', - self.app.preferences['digits_after_comma']) + localized_value = QLocale().toString(float(scientific_value * multiplier), 'f', digits) else: - localized_value = QLocale().toString(float(value), 'f', - self.app.preferences['digits_after_comma']) + localized_value = QLocale().toString(float(value * multiplier), 'f', digits) return localized_value, prefix @@ -70,7 +74,7 @@ class Relative(): value = yield from self.value() prefix = "" if international_system: - localized_value, prefix = self._to_si(value) + localized_value, prefix = Relative.to_si(value, self.app.preferences['digits_after_comma']) else: localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma']) @@ -87,7 +91,7 @@ class Relative(): value = yield from self.differential() prefix = "" if international_system and value != 0: - localized_value, prefix = self._to_si(value) + localized_value, prefix = Relative.to_si(value, self.app.preferences['digits_after_comma']) else: localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma']) diff --git a/src/sakia/core/money/relative_zerosum.py b/src/sakia/core/money/relative_zerosum.py index f32b5274..a98ae864 100644 --- a/src/sakia/core/money/relative_zerosum.py +++ b/src/sakia/core/money/relative_zerosum.py @@ -2,6 +2,7 @@ from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP, QLocale from .relative import Relative import asyncio + class RelativeZSum: _NAME_STR_ = QT_TRANSLATE_NOOP('RelativeZSum', 'Relat Z-sum') _REF_STR_ = QT_TRANSLATE_NOOP('RelativeZSum', "{0} R0 {1}") @@ -33,17 +34,15 @@ class RelativeZSum: :param sakia.core.community.Community community: Community instance :return: float """ - ud_block = yield from self.community.get_ud_block() - if ud_block and ud_block['membersCount'] > 0: + current = yield from self.community.get_block() + if current and current['membersCount'] > 0: monetary_mass = yield from self.community.monetary_mass() dividend = yield from self.community.dividend() - median = monetary_mass / ud_block['membersCount'] - relative_value = self.amount / float(dividend) - relative_median = median / dividend + average = monetary_mass / current['membersCount'] + rz_value = (self.amount - average) / float(dividend) else: - relative_value = self.amount - relative_median = 0 - return relative_value - relative_median + rz_value = self.amount + return rz_value @asyncio.coroutine def differential(self): @@ -53,7 +52,11 @@ class RelativeZSum: def localized(self, units=False, international_system=False): value = yield from self.value() - localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma']) + prefix = "" + if international_system: + localized_value, prefix = Relative.to_si(value, self.app.preferences['digits_after_comma']) + else: + localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma']) if units: return QCoreApplication.translate("RelativeZSum", RelativeZSum._REF_STR_)\ @@ -65,7 +68,11 @@ class RelativeZSum: def diff_localized(self, units=False, international_system=False): value = yield from self.differential() - localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma']) + prefix = "" + if international_system and value != 0: + localized_value, prefix = Relative.to_si(value, self.app.preferences['digits_after_comma']) + else: + localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma']) if units: return QCoreApplication.translate("RelativeZSum", RelativeZSum._REF_STR_)\ -- GitLab