NumberExt API - lifedever/kt-speedy-toolbox GitHub Wiki
数字扩展提供了丰富的数值计算、格式化和转换功能,支持安全的数学运算和各种格式化需求。
检查数值是否在指定范围内(包含边界)。
fun Int.isBetween(min: Int, max: Int): Boolean
示例:
val number = 15
println(number.isBetween(10, 20)) // true
println(number.isBetween(20, 30)) // false
执行安全的除法运算,避免除零错误。
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 (自定义错误返回值)
执行精确的乘法运算。
fun Number.mmul(value: Number): Number
示例:
val result = 10.1.mmul(2.5) // 25.25
执行精确的加法运算。
fun Number.aadd(value: Number): Number
示例:
val result = 10.1.aadd(2.5) // 12.6
执行精确的减法运算。
fun Number.ssub(value: Number): Number
示例:
val result = 10.1.ssub(2.5) // 7.6
将数值转换为百分比字符串格式。
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"
将数值转换为字符串,空值时显示指定字符。
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("无")) // "无"
将数字格式化为指定位数的相同数字。
fun Int.formatToSameDigit(digit: Int): Int
示例:
val number = 123
println(number.formatToSameDigit(8)) // 888 (3位数字,每位都是8)
保留指定小数位数,支持不同的舍入模式。
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
转换为百分比数值(乘以100)。
fun Number.toPercentNumber(scale: Int = 3): Double
示例:
val rate = 0.12345
println(rate.toPercentNumber()) // 12.345
println(rate.toPercentNumber(1)) // 12.3
安全地转换为整数类型。
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
安全地转换为双精度浮点数。
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
当数值小于零时执行指定操作。
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
将元转换为分(人民币单位转换)。
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)}")
-
精度问题: 使用
ddiv()
,mmul()
,aadd()
,ssub()
等方法可以避免浮点数精度问题 - 空值处理: 格式化方法支持空值处理,可以自定义空值显示文本
-
舍入模式:
round()
方法默认使用四舍五入,可以指定其他舍入模式 -
类型安全:
toSafeInt()
和toSafeDouble()
提供类型安全的转换 - 货币计算: 货币相关计算建议使用精确运算方法,避免精度丢失