diff --git a/core/ui/src/main/java/com/tangem/core/ui/format/bigdecimal/BigDecimalFiatFormat.kt b/core/ui/src/main/java/com/tangem/core/ui/format/bigdecimal/BigDecimalFiatFormat.kt index 2c29aedd8b..e8eb6add6d 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/format/bigdecimal/BigDecimalFiatFormat.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/format/bigdecimal/BigDecimalFiatFormat.kt @@ -232,7 +232,7 @@ private fun BigDecimal.isLessThanThreshold() = this > BigDecimal.ZERO && this < * Returns amount with correct scale */ fun getFiatPriceAmountWithScale(value: BigDecimal): Pair { - return if (value < BigDecimal.ONE) { + return if (value > BigDecimal.ZERO && value < BigDecimal.ONE) { val leadingZeroes = value.scale() - value.precision() val scale = leadingZeroes + FRACTIONAL_PART_LENGTH_AFTER_LEADING_ZEROES diff --git a/core/ui/src/test/kotlin/com/tangem/core/ui/format/bigdecimal/BigDecimalFiatFormatTest.kt b/core/ui/src/test/kotlin/com/tangem/core/ui/format/bigdecimal/BigDecimalFiatFormatTest.kt index d5c2cb310e..fcc2eca898 100644 --- a/core/ui/src/test/kotlin/com/tangem/core/ui/format/bigdecimal/BigDecimalFiatFormatTest.kt +++ b/core/ui/src/test/kotlin/com/tangem/core/ui/format/bigdecimal/BigDecimalFiatFormatTest.kt @@ -294,4 +294,52 @@ internal class BigDecimalFiatFormatTest { Truth.assertThat(formatted) .isEqualTo("0.00000000000000000000123".addUsdSymbolLeft()) } + + @Test + fun `price zero is formatted with default precision and does not crash`() { + val testValue = BigDecimal.ZERO + + val formatted = testValue.format { + fiat( + fiatCurrencyCode = usdCurrencyCode, + fiatCurrencySymbol = usdSymbol, + locale = testLocale, + ).price() + } + + Truth.assertThat(formatted) + .isEqualTo("0.00".addUsdSymbolLeft()) + } + + @Test + fun `price negative integer keeps sign and does not crash`() { + val testValue = BigDecimal("-500") + + val formatted = testValue.format { + fiat( + fiatCurrencyCode = usdCurrencyCode, + fiatCurrencySymbol = usdSymbol, + locale = testLocale, + ).price() + } + + Truth.assertThat(formatted) + .isEqualTo("-" + "500.00".addUsdSymbolLeft()) + } + + @Test + fun `price negative fractional keeps sign and does not crash`() { + val testValue = BigDecimal("-0.5") + + val formatted = testValue.format { + fiat( + fiatCurrencyCode = usdCurrencyCode, + fiatCurrencySymbol = usdSymbol, + locale = testLocale, + ).price() + } + + Truth.assertThat(formatted) + .isEqualTo("-" + "0.50".addUsdSymbolLeft()) + } } \ No newline at end of file diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/converter/MarketsTokenItemConverter.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/converter/MarketsTokenItemConverter.kt index dda2c04ee8..f9373e37a1 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/converter/MarketsTokenItemConverter.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/converter/MarketsTokenItemConverter.kt @@ -15,6 +15,7 @@ import com.tangem.domain.markets.TokenMarket import com.tangem.features.feed.impl.R import com.tangem.features.feed.model.market.list.state.MarketsListUM import com.tangem.utils.converter.Converter +import com.tangem.utils.logging.TangemLogger import kotlinx.collections.immutable.toImmutableList import java.math.BigDecimal import java.math.RoundingMode @@ -92,7 +93,15 @@ internal class MarketsTokenItemConverter( private fun TokenMarket.getCurrentPrice(prev: TokenMarket? = null): MarketsListItemUM.Price { val prevPrice = prev?.tokenQuotesShort?.currentPrice - val priceText = tokenQuotesShort.currentPrice.format { + val currentPrice = tokenQuotesShort.currentPrice + if (currentPrice < BigDecimal.ZERO) { + TangemLogger.withTag(MARKETS_PRICE_LOG_TAG).w( + messageString = "Unexpected non-positive price for tokenId=$id, symbol=$symbol, " + + "currency=${appCurrency.code}, value=${currentPrice.toPlainString()}", + ) + } + + val priceText = currentPrice.format { fiat( fiatCurrencyCode = appCurrency.code, fiatCurrencySymbol = appCurrency.symbol, @@ -162,4 +171,8 @@ internal class MarketsTokenItemConverter( return percent.format { percent() } } + + private companion object { + const val MARKETS_PRICE_LOG_TAG = "MarketsTokenItemConverter" + } } \ No newline at end of file