Updated on 2026-08-14

This commit is contained in:
Tangem 2023-04-17 18:46:36 +03:00
parent 6760d7c16e
commit 4f927cad74
4 changed files with 43 additions and 8 deletions

View file

@ -5,10 +5,12 @@ import android.text.SpannedString
import android.text.style.RelativeSizeSpan
import androidx.core.text.buildSpannedString
import com.tangem.common.extensions.isZero
import timber.log.Timber
import java.math.BigDecimal
import java.math.RoundingMode
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.text.NumberFormat
import java.util.*
// TODO: move extensions to utils
@ -46,7 +48,18 @@ fun BigDecimal.toFormattedCurrencyString(
return "$formattedAmount $currency"
}
fun BigDecimal.toFiatRateString(fiatCurrencyName: String): String {
fun BigDecimal.toFiatRateString(fiatCurrencyName: String, fiatCode: String): String {
try {
val formatter = NumberFormat.getCurrencyInstance()
Currency.getInstance(fiatCode)?.let { currency ->
formatter.currency = currency
formatter.maximumFractionDigits = 2
formatter.roundingMode = RoundingMode.HALF_UP
return formatter.format(this)
}
} catch (e: IllegalArgumentException) {
Timber.e(e, "can't parse currency")
}
val value = this
.setScale(2, RoundingMode.HALF_UP)
.formatWithSpaces()
@ -56,10 +69,15 @@ fun BigDecimal.toFiatRateString(fiatCurrencyName: String): String {
fun BigDecimal.toFiatString(
rateValue: BigDecimal,
fiatCurrencyName: String,
fiatCode: String,
formatWithSpaces: Boolean = false,
): String {
val fiatValue = rateValue.multiply(this)
return fiatValue.toFormattedFiatValue(fiatCurrencyName, formatWithSpaces)
return fiatValue.toFormattedFiatValue(
fiatCurrencyName = fiatCurrencyName,
fiatCode = fiatCode,
formatWithSpaces = formatWithSpaces,
)
}
fun BigDecimal.toFiatValue(rateValue: BigDecimal): BigDecimal {
@ -67,7 +85,22 @@ fun BigDecimal.toFiatValue(rateValue: BigDecimal): BigDecimal {
return fiatValue.setScale(2, RoundingMode.HALF_UP)
}
fun BigDecimal.toFormattedFiatValue(fiatCurrencyName: String, formatWithSpaces: Boolean = false): String {
fun BigDecimal.toFormattedFiatValue(
fiatCurrencyName: String,
fiatCode: String,
formatWithSpaces: Boolean = false,
): String {
try {
val formatter = NumberFormat.getCurrencyInstance()
Currency.getInstance(fiatCode)?.let { currency ->
formatter.currency = currency
formatter.maximumFractionDigits = 2
formatter.roundingMode = RoundingMode.HALF_UP
return formatter.format(this)
}
} catch (e: IllegalArgumentException) {
Timber.e(e, "can't parse currency")
}
val fiatValue = this.setScale(2, RoundingMode.HALF_UP)
.let { if (formatWithSpaces) it.formatWithSpaces() else it }
return "$fiatValue$fiatCurrencyName"

View file

@ -36,12 +36,12 @@ internal fun WalletDataModel.getFormattedFiatAmount(
): String {
return this.fiatRate?.let { status.amount.toFiatValue(it) }
?.takeIf { !status.isErrorStatus }
?.toFormattedFiatValue(fiatCurrency.symbol)
?.toFormattedFiatValue(fiatCurrencyName = fiatCurrency.symbol, fiatCode = fiatCurrency.code)
?: unknownAmountSign
}
internal fun WalletDataModel.getFormattedFiatRate(fiatCurrency: FiatCurrency, noRateValue: String): String {
return fiatRate?.toFiatRateString(fiatCurrency.symbol)
return fiatRate?.toFiatRateString(fiatCurrency.symbol, fiatCurrency.code)
?: noRateValue
}

View file

@ -15,7 +15,7 @@ internal fun List<UserWalletModel>.toUiModels(appCurrency: FiatCurrency): Sequen
is TotalFiatBalance.Failed -> UserWalletItem.Balance.Failed
is TotalFiatBalance.Loading -> UserWalletItem.Balance.Loading
is TotalFiatBalance.Loaded -> UserWalletItem.Balance.Loaded(
amount = fiatBalance.amount.toFormattedFiatValue(appCurrency.symbol),
amount = fiatBalance.amount.toFormattedFiatValue(appCurrency.symbol, appCurrency.code),
showWarning = fiatBalance.isWarning,
)
}