用Kotlin的digitToIntOrNull玩轉字符轉換
舉個栗子??:你遇到過這些尷尬嗎?
當你在解析驗證碼時遇到字符'G',或者處理用戶輸入時收到一個'?',是不是經常要手寫一堆if-else來檢查字符合法性?現在試試這個神奇函數:
fun parseCode(input: Char): Int? {
return input.digitToIntOrNull() // 一行代碼搞定驗證
}
digitToIntOrNull 是 Kotlin 標準庫的一部分,位于 kotlin.text 包下。它有兩個主要的用法:
- 默認十進制轉換:直接將一個字符轉換為十進制整數。如果字符不是有效的十進制數字,則返回 null。
- 指定進制轉換:將一個字符轉換為指定進制(radix)下的整數。如果字符在該進制下無效,則返回 null。需要注意的是,進制范圍必須在 2 到 36 之間,否則會拋出異常。
這個函數有多智能?
想象你有個全能驗鈔機,不僅能識別人民幣,還能自動切換美元、歐元,甚至能檢測假幣。digitToIntOrNull就是代碼世界的智能驗鈔機:
基礎模式(十進制偵探)
println('7'.digitToIntOrNull()) // 輸出7 → 正經數字
println('??'.digitToIntOrNull()) // 輸出null → 表情包退散!
進階模式(進制變形金剛)
// 十六進制模式
println('F'.digitToIntOrNull(16)) // 輸出15 → 十六進制的寵兒
println('G'.digitToIntOrNull(16)) // 輸出null → 超標的字母
// 三十二進制大挑戰
println('Z'.digitToIntOrNull(32)) // 輸出31 → 字母天花板
println('a'.digitToIntOrNull(32)) // 輸出10 → 大小寫通吃
避坑指南?:這些情況會翻車
① 二進制遇到情場浪子
println('2'.digitToIntOrNull(2)) // null → 二進制只認0和1
② 全角字符的cosplay
val fullWidthA = 'A' // 全角A(Unicode:\uFF21)
println(fullWidthA.digitToIntOrNull(16)) // 輸出10 → 偽裝成功!
③ 希臘字母的悲劇
println('β'.digitToIntOrNull(36)) // null → 只認拉丁字母
示例:用這個函數寫個進制轉換
fun convertToDecimal(char: Char, base: Int): String {
return char.digitToIntOrNull(base)?.let {
"『$char』在${base}進制中等于 $it"
} ?: "?? 警報!『$char』在${base}進制里是冒牌貨"
}
fun main() {
println(convertToDecimal('L', 20)) // → 20進制中L=18
println(convertToDecimal('喵', 36)) // → 觸發警報
}
冷知識:為什么進制上限是36?
因為拉丁字母(26個) + 數字(10個) = 36個符號,剛好可以覆蓋所有情況。想挑戰更高進制?除非你打算用emoji當數字符號??
什么時候認為字符是有效的數字?
fun Char.digitToIntOrNull(radix: Int): Int?
? 如果字符是常規的十進制數字(0-9),那么它自然是有效的。
? 如果字符是大寫或小寫的拉丁字母(A-Z 或 a-z),并且其編碼值小于 radix + 'A'.code - 10 或 radix + 'a'.code - 10,那么它也是有效的。
? 全角拉丁字母(\uFF21-\uFF3A 或 \uFF41-\uFF5A)同樣適用上述規則。