diff options
| author | Mavridis Philippe <mavridisf@gmail.com> | 2024-04-05 20:19:23 +0300 |
|---|---|---|
| committer | Mavridis Philippe <mavridisf@gmail.com> | 2024-05-18 11:24:10 +0300 |
| commit | 979ee566e7adba689fad7760b7a25db1216d438f (patch) | |
| tree | 2441dd937de16dbd7b1fbce8c591d6dea84e4adc /kspread/valuecalc.cpp | |
| parent | 950f6aa09f2020beffe17aa367c096c2fed3e6b0 (diff) | |
| download | koffice-979ee566e7adba689fad7760b7a25db1216d438f.tar.gz koffice-979ee566e7adba689fad7760b7a25db1216d438f.zip | |
KSpread: Add natural comparison operators.
Natural comparison does not depend on the type of data (whether it's a string or a number).
Based on Calligra Sheets code originally from revision 551470.
Signed-off-by: Mavridis Philippe <mavridisf@gmail.com>
(cherry picked from commit 4f21f4038f558fa330c307cc3745d6c3568b8b56)
Diffstat (limited to 'kspread/valuecalc.cpp')
| -rw-r--r-- | kspread/valuecalc.cpp | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/kspread/valuecalc.cpp b/kspread/valuecalc.cpp index 3a1182e54..2f6b4b8dd 100644 --- a/kspread/valuecalc.cpp +++ b/kspread/valuecalc.cpp @@ -433,9 +433,70 @@ bool ValueCalc::approxEqual (const Value &a, const Value &b) return (x < 0.0 ? -x : x) < ((aa < 0.0 ? -aa : aa) * DBL_EPSILON); } -bool ValueCalc::strEqual (const Value &a, const Value &b) +bool ValueCalc::strEqual (const Value &a, const Value &b, bool CS) { - return (converter->asString (a).asString() == converter->asString (b).asString()); + TQString aa = converter->asString(a).asString(); + TQString bb = converter->asString(b).asString(); + if (!CS) { + aa = aa.lower(); + bb = bb.lower(); + } + return (aa == bb); +} + +bool ValueCalc::strGreater (const Value &a, const Value &b, bool CS) +{ + TQString aa = converter->asString(a).asString(); + TQString bb = converter->asString(b).asString(); + if (!CS) { + aa = aa.lower(); + bb = bb.lower(); + } + return (aa > bb); +} + +bool ValueCalc::strGequal (const Value &a, const Value &b, bool CS) +{ + TQString aa = converter->asString(a).asString(); + TQString bb = converter->asString(b).asString(); + if (!CS) { + aa = aa.lower(); + bb = bb.lower(); + } + return (aa >= bb); +} + +bool ValueCalc::strLower (const Value &a, const Value &b, bool CS) +{ + return strGreater (b, a, CS); +} + +bool ValueCalc::naturalEqual (const Value &a, const Value &b, bool CS) +{ + if (a.isNumber() && b.isNumber()) + return approxEqual(a, b); + if (a.allowComparison(b)) + return a.equal(b); + return strEqual(a, b, CS); +} + +bool ValueCalc::naturalGreater (const Value &a, const Value &b, bool CS) +{ + if (a.isNumber() && b.isNumber()) + return greater(a, b); + if (a.allowComparison(b)) + return a.greater(b); + return strGreater(a, b, CS); +} + +bool ValueCalc::naturalGequal (const Value &a, const Value &b, bool CS) +{ + return naturalGreater(a, b, CS) || naturalEqual(a, b, CS); +} + +bool ValueCalc::naturalLower (const Value &a, const Value &b, bool CS) +{ + return naturalGreater(b, a, CS); } bool ValueCalc::greater (const Value &a, const Value &b) |
