ds park
ds park

Reputation: 55

Cannot format given Object as a Number in Kotlin

An error occurred while using the ConverPrice function as follows for information about the price.

The price of the item in the recycler view adapter onBindViewHolder.

As a result of debugging, the error occurs in the following code.

priceText = "${dec.format(priceMin)} ~ ${dec.format(priceMax)}"

Please check my code and answer.

        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

            when (holder) {
                is DataViewHolder -> {
                    val item = dataList[position]

                    item.price.let {
                        holder.price.text = ConvertPrice(item, holder.price)
                    }

                }
            }
        }

fun ConvertPrice(productDetail: ProductDetail?, tv: TextView? = null, setPrice: Boolean = false): String {
    val disableColor = Color.parseColor("#aaaaaa")
    val enableColor = Color.parseColor("#3692ff")

    tv?.setTextColor(disableColor)

    if (ProductDetail != null) {
        val priceMin = productDetail.priceMin
        val priceMax = productDetail.priceMax
        var priceText = ""

        val dec = DecimalFormat("##,###")

        productDetail.enabledRetail?.let {
            if (productDetail.enabledRetail == true) {
                if (setPrice) {
                    priceText = if (priceMin == null || priceMax == null) {
                        "No pricing information"
                    } else {
                        "${dec.format(priceMin)} ~ ${dec.format(priceMax)}"
                    }
                    tv?.setTextColor(disableColor)
                }
                else {
                    priceText = dec.format(wineDetail.price).toString()
                    tv?.setTextColor(enableColor)
                }
                return priceText
            } else if (productDetail.cntRating!! > 0) {
                if ((priceMin == null && priceMax == null) || (priceMin == 0 && priceMax == 0)) {
                    priceText = "No pricing information"
                } else {
                    priceText =
                        "${dec.format(priceMin)} ~ ${dec.format(priceMax)}"
                    tv?.setTextColor(disableColor)
                }
                return priceText
            }
        }
    }
    return "No pricing information"
}


Upvotes: 1

Views: 861

Answers (1)

Sinner of the System
Sinner of the System

Reputation: 2966

DecimalFormat.format() only works fine with long or double. You should convert "priceMin" and "priceMax" to Long.

val priceMin = productDetail.priceMin.toLong()
val priceMax = productDetail.priceMax.toLong()

I recommend to use NumberFormat instead of DecimalFormat because it is locale-sensitive

val decFormat = NumberFormat.getInstance() // or getCurrencyInstance()
decFormat.maximumFractionDigits = 3
decFormat.format(priceMin)
decFormat.format(priceMax)

Upvotes: 1

Related Questions