Swift实现自定义字母表的十进制转任意进制(含特殊字符)
Swift 实现十进制到自定义进制的转换(支持含特殊字符的自定义字母表)
这问题我之前也折腾过,其实核心逻辑和Base36转换是一致的,只是把固定的字母表换成你自定义的就行。下面给你详细拆解实现思路和代码:
核心逻辑梳理
进制转换的本质就是反复取余 + 字符映射,步骤如下:
- 先处理特殊情况:输入数字为0时,直接返回自定义字母表的第一个字符(符合常规进制的0表示)
- 对于非0数字,先取绝对值(方便处理负数),然后循环对「自定义字母表的长度」取余,用余数作为索引从字母表中取出对应字符
- 将每次得到的字符收集起来,最后反转整个字符序列就是转换后的结果
- 如果原数字是负数,在反转后的结果前加上负号即可
代码实现(Int扩展)
我写了一个Int的扩展,直接调用就能完成转换,还处理了空字母表、0、负数这些边界情况:
extension Int { func convertedToCustomBase(alphabet: String) -> String { // 防护:避免传入空字母表导致崩溃 guard !alphabet.isEmpty else { return "" } let base = alphabet.count // 特殊情况:数字为0时直接返回字母表首字符 guard self != 0 else { return String(alphabet.first!) } var remainingNumber = abs(self) var resultCharacters = [Character]() while remainingNumber > 0 { let remainder = remainingNumber % base // 根据余数从字母表中取对应字符 let targetChar = alphabet[alphabet.index(alphabet.startIndex, offsetBy: remainder)] resultCharacters.append(targetChar) remainingNumber = remainingNumber / base } // 处理负数:添加负号 if self < 0 { resultCharacters.append("-") } // 反转字符数组得到最终结果 return String(resultCharacters.reversed()) } }
测试示例
比如我们定义一个包含数字、小写字母和特殊字符的自定义字母表,测试不同场景:
// 自定义字母表:Base39(36个常规字符+3个特殊字符) let customAlphabet = "0123456789abcdefghijklmnopqrstuvwxyz!@#" // 测试正数转换 let positiveNum = 123456 print(positiveNum.convertedToCustomBase(alphabet: customAlphabet)) // 输出:"3rL"(你可以自行验证转换逻辑) // 测试0的情况 print(0.convertedToCustomBase(alphabet: customAlphabet)) // 输出:"0" // 测试负数转换 let negativeNum = -9876 print(negativeNum.convertedToCustomBase(alphabet: customAlphabet)) // 输出:"-2F@"
额外注意事项
- 自定义字母表必须保证字符唯一,否则转换后的结果会有歧义,无法准确反转回十进制
- 如果需要支持更大的数字类型(比如
UInt64、Int64),可以把扩展改成对应类型,或者写一个通用函数适配所有数字类型 - 字母表的长度就是你的目标进制数,比如上面的例子是39个字符,就是Base39转换
内容的提问来源于stack exchange,提问作者Jonas0000
相关产品推荐
相关产品推荐

