Updated on 2026-08-14

This commit is contained in:
Tangem 2026-05-06 10:35:39 +02:00
parent a107f9299d
commit 13f139afa8
3 changed files with 63 additions and 2 deletions

View file

@ -232,7 +232,7 @@ private fun BigDecimal.isLessThanThreshold() = this > BigDecimal.ZERO && this <
* Returns amount with correct scale
*/
fun getFiatPriceAmountWithScale(value: BigDecimal): Pair<BigDecimal, Int> {
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

View file

@ -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())
}
}

View file

@ -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"
}
}