taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit b08eb3a442024adaa3c02bc94a4a96191790c287
parent 6c89fb8735fcb5413ed72b5ca4ea934088fbe89a
Author: Marc Stibane <marc@taler.net>
Date:   Mon,  4 Dec 2023 09:36:59 +0100

bugfix for inputDigits=0

Diffstat:
Mtaler-swift/Sources/taler-swift/Amount.swift | 58++++++++++++++++++++++++++++++++++------------------------
1 file changed, 34 insertions(+), 24 deletions(-)

diff --git a/taler-swift/Sources/taler-swift/Amount.swift b/taler-swift/Sources/taler-swift/Amount.swift @@ -312,33 +312,43 @@ public final class Amount: Codable, Hashable, @unchecked Sendable, CustomStringC /// Multiplies by ten, then adds digit public func shiftLeft(add digit: UInt8, _ inputDigits: UInt) { - // how many digits to shift right (e.g. inputD=2 ==> shift:=6) - let shift = Self.fractionalBaseDigits - inputDigits - // mask to zero out fractions smaller than inputDigits - let shiftMask = fractionalBase(shift) - - let carryMask = fractionalBase(Self.fractionalBaseDigits - 1) - // get biggest fractional digit - let carry = fraction / carryMask - var remainder = fraction % carryMask -// print("fraction: \(fraction) = \(carry) + \(remainder)") - - let shiftedInt = integer * 10 + UInt64(carry) - if shiftedInt < Self.maxValue { - self.integer = shiftedInt -// print("remainder: \(remainder) / shiftMask \(shiftMask) = \(remainder / shiftMask)") - remainder = (remainder / shiftMask) * 10 - } else { // will get too big - // Just swap the last significant digit for the one the user typed last - if shiftMask >= 10 { - remainder = (remainder / (shiftMask / 10)) * 10 + if inputDigits > 0 { + // how many digits to shift right (e.g. inputD=2 ==> shift:=6) + let shift = Self.fractionalBaseDigits - inputDigits + // mask to zero out fractions smaller than inputDigits + let shiftMask = fractionalBase(shift) + + let carryMask = fractionalBase(Self.fractionalBaseDigits - 1) + // get biggest fractional digit + let carry = fraction / carryMask + var remainder = fraction % carryMask +// print("fraction: \(fraction) = \(carry) + \(remainder)") + + let shiftedInt = integer * 10 + UInt64(carry) + if shiftedInt < Self.maxValue { + self.integer = shiftedInt +// print("remainder: \(remainder) / shiftMask \(shiftMask) = \(remainder / shiftMask)") + remainder = (remainder / shiftMask) * 10 + } else { // will get too big + // Just swap the last significant digit for the one the user typed last + if shiftMask >= 10 { + remainder = (remainder / (shiftMask / 10)) * 10 + } else { + remainder = (remainder / 10) * 10 + } + } + let sum = remainder + UInt32(digit) + self.fraction = sum * shiftMask + // print("(remainder: \(remainder) + \(digit)) * base(shift) \(shiftMask) = fraction \(fraction)") + } else { + let shiftedInt = integer * 10 + UInt64(digit) + if shiftedInt < Self.maxValue { + self.integer = shiftedInt } else { - remainder = (remainder / 10) * 10 + self.integer = Self.maxValue } + self.fraction = 0 } - let sum = remainder + UInt32(digit) - self.fraction = sum * shiftMask -// print("(remainder: \(remainder) + \(digit)) * base(shift) \(shiftMask) = fraction \(fraction)") } /// Sets all fractional digits after inputDigits to 0