NumberExt API - lifedever/kt-speedy-toolbox GitHub Wiki

数字扩展 API (NumberExt)

数字扩展提供了丰富的数值计算、格式化和转换功能,支持安全的数学运算和各种格式化需求。

📋 目录

数值验证

isBetween()

检查数值是否在指定范围内(包含边界)。

fun Int.isBetween(min: Int, max: Int): Boolean

示例:

val number = 15
println(number.isBetween(10, 20)) // true
println(number.isBetween(20, 30)) // false

安全数学运算

ddiv() - 安全除法

执行安全的除法运算,避免除零错误。

fun Number.ddiv(value: Number, scale: Int = 3, errorReturnValue: Double = 0.0): Double

参数:

  • value: 除数
  • scale: 保留小数位数,默认3位
  • errorReturnValue: 除零时返回的默认值,默认0.0

示例:

val a = 10.5
val b = 3.2
val c = 0.0

println(a.ddiv(b, 2))    // 3.28
println(a.ddiv(c, 2))    // 0.0 (避免除零错误)
println(a.ddiv(c, 2, -1.0)) // -1.0 (自定义错误返回值)

mmul() - 精确乘法

执行精确的乘法运算。

fun Number.mmul(value: Number): Number

示例:

val result = 10.1.mmul(2.5) // 25.25

aadd() - 精确加法

执行精确的加法运算。

fun Number.aadd(value: Number): Number

示例:

val result = 10.1.aadd(2.5) // 12.6

ssub() - 精确减法

执行精确的减法运算。

fun Number.ssub(value: Number): Number

示例:

val result = 10.1.ssub(2.5) // 7.6

格式化功能

toPercentStr()

将数值转换为百分比字符串格式。

fun Number?.toPercentStr(nullableChar: String = "-"): String

示例:

val rate1 = 0.856
val rate2: Double? = null

println(rate1.toPercentStr())     // "85.6%"
println(rate2.toPercentStr())     // "-"
println(rate2.toPercentStr("N/A")) // "N/A"

toNumberStr()

将数值转换为字符串,空值时显示指定字符。

fun Number?.toNumberStr(nullableChar: String = "-"): String

示例:

val num1 = 123.45
val num2: Double? = null

println(num1.toNumberStr())       // "123.45"
println(num2.toNumberStr())       // "-"
println(num2.toNumberStr(""))   // "无"

formatToSameDigit()

将数字格式化为指定位数的相同数字。

fun Int.formatToSameDigit(digit: Int): Int

示例:

val number = 123
println(number.formatToSameDigit(8)) // 888 (3位数字,每位都是8)

精度控制

round()

保留指定小数位数,支持不同的舍入模式。

fun Number.round(scale: Int, roundingMode: RoundingMode = RoundingMode.HALF_UP): Double

示例:

val number = 123.456789

println(number.round(2))                           // 123.46
println(number.round(2, RoundingMode.HALF_DOWN))   // 123.45
println(number.round(0))                           // 123.0

toPercentNumber()

转换为百分比数值(乘以100)。

fun Number.toPercentNumber(scale: Int = 3): Double

示例:

val rate = 0.12345
println(rate.toPercentNumber())    // 12.345
println(rate.toPercentNumber(1))   // 12.3

类型转换

toSafeInt()

安全地转换为整数类型。

fun Any.toSafeInt(): Int?
fun Any.toSafeInt(default: Int): Int

示例:

val bigDecimal = BigDecimal("123")
val string = "not a number"

println(bigDecimal.toSafeInt())     // 123
println(string.toSafeInt())         // null
println(string.toSafeInt(-1))       // -1

toSafeDouble()

安全地转换为双精度浮点数。

fun Any?.toSafeDouble(): Double?
fun Any?.toSafeDouble(default: Double): Double

示例:

val int = 123
val string = "not a number"
val nullValue: Any? = null

println(int.toSafeDouble())           // 123.0
println(string.toSafeDouble())        // null
println(nullValue.toSafeDouble(0.0))  // 0.0

条件判断

ifLessThanZero()

当数值小于零时执行指定操作。

inline fun Number.ifLessThanZero(block: () -> Number): Number

示例:

val negativeNumber = -5.0
val positiveNumber = 10.0

val result1 = negativeNumber.ifLessThanZero { 0.0 } // 0.0
val result2 = positiveNumber.ifLessThanZero { 0.0 } // 10.0

货币转换

convertYunToCent()

将元转换为分(人民币单位转换)。

fun Double.convertYunToCent(): Int

示例:

val yuan = 12.34
val fen = yuan.convertYunToCent() // 1234

val yuan2 = 0.01
val fen2 = yuan2.convertYunToCent() // 1

实用示例

价格计算示例

// 商品价格计算
val originalPrice = 99.99
val discountRate = 0.15
val taxRate = 0.08

// 计算折扣价格
val discountAmount = originalPrice.mmul(discountRate)
val discountedPrice = originalPrice.ssub(discountAmount)

// 计算含税价格
val taxAmount = discountedPrice.mmul(taxRate)
val finalPrice = discountedPrice.aadd(taxAmount)

println("原价: ${originalPrice.toNumberStr()}")
println("折扣: ${discountRate.toPercentStr()}")
println("折扣后价格: ${discountedPrice.round(2)}")
println("最终价格: ${finalPrice.round(2)}")

统计数据格式化示例

val totalUsers = 1250
val activeUsers = 856
val conversionRate = activeUsers.toDouble().ddiv(totalUsers.toDouble(), 4)

println("总用户数: ${totalUsers.toNumberStr()}")
println("活跃用户数: ${activeUsers.toNumberStr()}")
println("转化率: ${conversionRate.toPercentStr()}")
println("转化率数值: ${conversionRate.toPercentNumber(2)}%")

安全计算示例

fun calculateAverage(numbers: List<Double>): Double {
    val sum = numbers.fold(0.0) { acc, num -> acc.aadd(num) }
    val count = numbers.size.toDouble()
    
    return sum.ddiv(count, 2, 0.0) // 安全除法,避免除零
}

val scores = listOf(85.5, 92.0, 78.5, 95.0)
val average = calculateAverage(scores)
println("平均分: ${average.round(1)}")

📝 注意事项

  1. 精度问题: 使用 ddiv(), mmul(), aadd(), ssub() 等方法可以避免浮点数精度问题
  2. 空值处理: 格式化方法支持空值处理,可以自定义空值显示文本
  3. 舍入模式: round() 方法默认使用四舍五入,可以指定其他舍入模式
  4. 类型安全: toSafeInt()toSafeDouble() 提供类型安全的转换
  5. 货币计算: 货币相关计算建议使用精确运算方法,避免精度丢失

🔗 相关链接

⚠️ **GitHub.com Fallback** ⚠️