summaryrefslogtreecommitdiff
path: root/taler-kotlin-common/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'taler-kotlin-common/src/main')
-rw-r--r--taler-kotlin-common/src/main/java/net/taler/common/Amount.kt27
1 files changed, 22 insertions, 5 deletions
diff --git a/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt b/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt
index 48bd643..49b699f 100644
--- a/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt
+++ b/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt
@@ -64,7 +64,7 @@ data class Amount(
* of 50_000_000 would correspond to 50 cents.
*/
val fraction: Int
-) {
+) : Comparable<Amount> {
companion object {
@@ -88,10 +88,14 @@ data class Amount(
fun fromJSONString(str: String): Amount {
val split = str.split(":")
if (split.size != 2) throw AmountParserException("Invalid Amount Format")
- // currency
- val currency = checkCurrency(split[0])
+ return fromString(split[0], split[1])
+ }
+
+ @Throws(AmountParserException::class)
+ @SuppressLint("CheckedExceptions")
+ fun fromString(currency: String, str: String): Amount {
// value
- val valueSplit = split[1].split(".")
+ val valueSplit = str.split(".")
val value = checkValue(valueSplit[0].toLongOrNull())
// fraction
val fraction: Int = if (valueSplit.size > 1) {
@@ -103,7 +107,7 @@ data class Amount(
?.roundToInt()
checkFraction(fraction)
} else 0
- return Amount(currency, value, fraction)
+ return Amount(checkCurrency(currency), value, fraction)
}
@Throws(AmountParserException::class)
@@ -197,4 +201,17 @@ data class Amount(
return "$amountStr $currency"
}
+ override fun compareTo(other: Amount): Int {
+ check(currency == other.currency) { "Can only compare amounts with the same currency" }
+ when {
+ value == other.value -> {
+ if (fraction < other.fraction) return -1
+ if (fraction > other.fraction) return 1
+ return 0
+ }
+ value < other.value -> return -1
+ else -> return 1
+ }
+ }
+
}