• Android进阶之路 - 盈利、亏损金额格式化


    在金融类型的app中,关于金额、数字都相对敏感和常见一些,在此仅记录我在金融行业期间学到的皮毛,如后续遇到新的场景也会加入该篇

    该篇大多采用 Kotlin 扩展函数的方式进行记录,尽可能熟悉 Kotlin 基础知识

    兄弟 Blog

    了解该篇后,会有一些常见的搭配使用方式

    • 收益 千分位、+、- 、变色 显示
      在这里插入图片描述

    使用方式

     textView.text = data.rateString()
     textView.textColor = data.rateColor()
    
    • 1
    • 2
    • 收益 +、- 、%、变色 显示

    在这里插入图片描述

    使用方式

     textView.text = data.rateYieldString()
     textView.textColor = data.rateColor()
    
    • 1
    • 2

    在这里插入图片描述

    toInt、toDouble

    我们为了显示效果,将金额做了千分位处理,所以当我们使用数据时需要去除千分位中的间隔符(,),该处扩展函数主要为了兼容千分位处理,并不影响原始的 toInttoDouble 执行逻辑

    fun String?.toInt(defaultValue: Int = 0): Int {
        if (this.isNullOrEmpty()) return defaultValue
        return this.replace(",", "").toDoubleOrNull()?.toInt() ?: defaultValue
    }
    
    inline fun String?.toInt(black: () -> Int): Int {
        try {
            if (this.isNullOrEmpty()) {
                return black.invoke()
            }
            return Integer.parseInt(this.replace(",", ""))
        } catch (throwable: Throwable) {
            Timber.e(throwable, "String?.toInt")
        }
        return black.invoke()
    }
    
    fun String?.toDouble(defaultValue: Double = 0.00): Double {
        if (this.isNullOrEmpty()) return defaultValue
        return this.replace(",", "").toDoubleOrNull() ?: defaultValue
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    千分位

    我们常见的数字可能不太会讲究千分位间隔显示效果,但是这种显示方式在金融型app中很常见, 针对金额太大的场景时通常会进行千分位处理,无数据场景一般会显示 --

    /**
     * 千分位
     */
    fun String?.toThousand(defaultValue: String = ""): String {
        try {
            if (this.isNullOrEmpty()) return defaultValue
            if (this == "--") return this
            val value = this.replace(",", "").toDoubleOrNull() ?: return defaultValue
    
            val decimalFormat = if (contains(".") && length - indexOf(".") == 4) {
                DecimalFormat("###,##0.000")
            } else if (contains(".") && length - indexOf(".") == 5) {
                DecimalFormat("###,##0.0000")
            } else {
                DecimalFormat("###,##0.00")
            }
            return decimalFormat.format(value)
        } catch (throwable: Throwable) {
            Timber.e(throwable)
        }
        return defaultValue
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    使用示例

    未处理金额:1000.00
    处理后金额:1,000.00

     textView.text = data.toThousand("--")
    
    • 1

    盈利、亏损

    我们看股票、基金时经常可以看到盈利、亏损时的表现形式都有所不同,例如+、-号的表示,以及 盈利为红色、亏损为绿色、未变化为灰色或黑色

    +、-

    fun String?.rateString(): String {
        if (this.isNullOrEmpty()) return "--"
        return if (toDouble() > 0.000001) {
            "+${toThousand()}"
        } else {
            toThousand()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用示例

     textView.text = data.rateString()
    
    • 1

    变色

    盈利为红、亏损为绿、未变化为黑色(自行改变色值即可)

    fun String?.rateColor(): Int {
        val value = toDouble()
        return when {
            value > 0.00001 -> "#CF1F1F"
            value < -0.00001 -> "#569C83"
            else -> "#333333"
        }.toColorInt()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用示例

    textView.textColor = data.rateColor()
    
    • 1

    在这里插入图片描述

    因为我在开发中采用了 html 方式实现富本文,所以简化了 toColorInt 转化

    fun String?.rateColorString(): String {
        val value = toDouble()
        return when {
            value > 0.00001 -> "#CF1F1F"
            value < -0.00001 -> "#569C83"
            else -> "#333333"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用示例

     textView.htmlString = "涨跌幅:${data.rateYieldString()}"}
    
    • 1

    %

    fun String?.rateYieldString(): String {
        if (this.isNullOrEmpty()) return "--"
        return if (toDouble() > 0.000001) {
            "+${toThousand()}%"
        } else {
            "${toThousand()}%"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用示例

     textView.text = data.rateYieldString("--")
    
    • 1
  • 相关阅读:
    STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
    为什么面试官狂问八股文?我已经被三家公司问到哑口无言……
    贪心算法实例(一):多任务分配问题
    【附源码】计算机毕业设计JAVA大数据文章发布系统
    HTML人物介绍、个人设计web前端大作业、贝聿铭人物介绍(带报告3000字)
    Oracle 创建和操作表
    Banana Pi BPI-W3(Armsom W3)RK3588开当板之调试UART
    Vue制作todoList事件备忘录经典小案例
    BP神经网络对指纹识别的应用(Matlab代码实现)
    C++修炼之路之继承<二>
  • 原文地址:https://blog.csdn.net/qq_20451879/article/details/132898316