diff options
author | Iván Ávalos <avalos@disroot.org> | 2024-02-20 14:11:56 -0600 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2024-03-27 14:26:43 -0300 |
commit | 390b562828b8ef0da98c2c8cf06a88055b2c8695 (patch) | |
tree | 14f7462d740ef14f2f86c31328c17e01ae4bef20 /taler-kotlin-android/src/main | |
parent | e305ddba1455a33e8dec037d4fcef8498e0b21a5 (diff) | |
download | taler-android-390b562828b8ef0da98c2c8cf06a88055b2c8695.tar.gz taler-android-390b562828b8ef0da98c2c8cf06a88055b2c8695.tar.bz2 taler-android-390b562828b8ef0da98c2c8cf06a88055b2c8695.zip |
[wallet] Improve DD51 unit rendering and adapt tests accordingly
(cherry picked from commit c7b2cbe5c39192648336746a719ecdfa88221b28)
Diffstat (limited to 'taler-kotlin-android/src/main')
-rw-r--r-- | taler-kotlin-android/src/main/java/net/taler/common/Amount.kt | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/taler-kotlin-android/src/main/java/net/taler/common/Amount.kt b/taler-kotlin-android/src/main/java/net/taler/common/Amount.kt index d6188cf..1652056 100644 --- a/taler-kotlin-android/src/main/java/net/taler/common/Amount.kt +++ b/taler-kotlin-android/src/main/java/net/taler/common/Amount.kt @@ -23,6 +23,7 @@ import kotlinx.serialization.Serializer import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import java.text.DecimalFormat +import java.text.DecimalFormatSymbols import java.text.NumberFormat import kotlin.math.floor import kotlin.math.pow @@ -214,32 +215,39 @@ public data class Amount( fun toString( showSymbol: Boolean = true, negative: Boolean = false, + symbols: DecimalFormatSymbols = DecimalFormat().decimalFormatSymbols, ): String { - val symbols = DecimalFormat().decimalFormatSymbols - - val format = if (showSymbol) { - NumberFormat.getCurrencyInstance() - } else { - // Make sure monetary separators are the ones used! - symbols.decimalSeparator = symbols.monetaryDecimalSeparator - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - symbols.groupingSeparator = symbols.monetaryGroupingSeparator + // We clone the object to safely/cleanly modify it + val s = symbols.clone() as DecimalFormatSymbols + val amount = (if (negative) "-$amountStr" else amountStr).toBigDecimal() + + // No currency spec, so we render normally + if (spec == null) { + val format = NumberFormat.getInstance() + format.maximumFractionDigits = MAX_FRACTION_LENGTH + format.minimumFractionDigits = 0 + if (Build.VERSION.SDK_INT >= 34) { + s.groupingSeparator = s.monetaryGroupingSeparator } + s.decimalSeparator = s.monetaryDecimalSeparator + (format as DecimalFormat).decimalFormatSymbols = s - NumberFormat.getInstance() + val fmt = format.format(amount) + return if (showSymbol) "$fmt $currency" else fmt } - if (spec != null) { - symbols.currencySymbol = spec.symbol(this) - format.maximumFractionDigits = spec.numFractionalNormalDigits - format.minimumFractionDigits = spec.numFractionalTrailingZeroDigits - } else { - symbols.currencySymbol = currency + // There is currency spec, so we can do things right + val format = NumberFormat.getCurrencyInstance() + format.maximumFractionDigits = spec.numFractionalNormalDigits + format.minimumFractionDigits = spec.numFractionalTrailingZeroDigits + s.currencySymbol = spec.symbol(this) + (format as DecimalFormat).decimalFormatSymbols = s + + val fmt = format.format(amount) + return if (showSymbol) fmt else { + // We should do better than manually removing the symbol here + fmt.replace(s.currencySymbol, "").trim() } - - (format as DecimalFormat).decimalFormatSymbols = symbols - - return format.format((if (negative) "-$amountStr" else amountStr).toBigDecimal()) } override fun compareTo(other: Amount): Int { |