summaryrefslogtreecommitdiff
path: root/taler-kotlin-android/src/main/java/net/taler/common
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2024-02-20 14:11:56 -0600
committerTorsten Grote <t@grobox.de>2024-03-27 14:26:43 -0300
commit390b562828b8ef0da98c2c8cf06a88055b2c8695 (patch)
tree14f7462d740ef14f2f86c31328c17e01ae4bef20 /taler-kotlin-android/src/main/java/net/taler/common
parente305ddba1455a33e8dec037d4fcef8498e0b21a5 (diff)
downloadtaler-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/java/net/taler/common')
-rw-r--r--taler-kotlin-android/src/main/java/net/taler/common/Amount.kt48
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 {