diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt b/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt index 632a28fe81..c5a6d6cd4f 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt @@ -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" diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/utils/WalletDataOperations.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/utils/WalletDataOperations.kt index 6b08921a5d..42be04542e 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/utils/WalletDataOperations.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/utils/WalletDataOperations.kt @@ -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 } diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/Mapper.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/Mapper.kt index 0e4319a4dc..d01e48d352 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/Mapper.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/Mapper.kt @@ -15,7 +15,7 @@ internal fun List.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, ) } diff --git a/app/src/main/res/layout/item_currency_wallet_content.xml b/app/src/main/res/layout/item_currency_wallet_content.xml index b27a1d1edb..5eb26a5bbb 100644 --- a/app/src/main/res/layout/item_currency_wallet_content.xml +++ b/app/src/main/res/layout/item_currency_wallet_content.xml @@ -19,6 +19,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:ellipsize="end" + android:gravity="start" android:maxLines="1" android:textColor="@color/text_primary_1" android:textSize="16sp" @@ -35,8 +36,8 @@ android:id="@+id/tv_amount_fiat" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:gravity="end" android:maxLines="1" - android:textAlignment="viewEnd" android:textColor="@color/text_primary_1" android:textSize="16sp" android:textStyle="bold" @@ -50,8 +51,8 @@ android:id="@+id/tv_amount" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:gravity="end" android:maxLines="1" - android:textAlignment="viewEnd" android:textColor="@color/text_tertiary" android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" @@ -66,6 +67,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:ellipsize="end" + android:gravity="start" android:maxLines="1" android:textColor="@color/text_tertiary" android:textSize="12sp"