object Test extends App {
def strNumToBaseFromBase(literal: String, tgtBase: Int, curBase: Int = 10): String = {
/*
@param literal: 字符串形式存储的待进制转换的数字字面量, eg: "123456QaZ"
@param tgtBase: 目标进制
@param curBase: 当前进制, 默认为10
*/
import scala.math._
// 构建双向映射关系
val ls1 = (0 until 66).toList
val ls2 = ('0' to '9') :++ ('a' to 'z') :++ ('A' to 'Z') :++ List('+', '-', '*', '/')
val map1To2 = (ls1.take(tgtBase) zip ls2.take(tgtBase)).toMap
val map2To1 = (ls2.take(curBase) zip ls1.take(curBase)).toMap
// 将当前进制转换为10进制
var numBase10: BigInt = 0
if (curBase == 10) {
numBase10 = BigInt(literal)
} else {
for (c <- literal)
numBase10 = numBase10 * curBase + map2To1(c)
}
// 将10进制转换为目标进制
if (tgtBase == 10) {
numBase10.toString
} else {
var lsRes = List[Char]()
while (numBase10 > 0) {
lsRes :+= map1To2((numBase10 % tgtBase).toInt)
numBase10 /= tgtBase
}
lsRes.reverse.map(_.toString).reduce(_ + _)
}
}
// Test
BigInt(1234567).toString(36) //"qglj"
strNumToBaseFromBase("1234567", 36) //"qglj"
strNumToBaseFromBase("qglj", 10, 36) //"1234567"
// Scala3新语法尝试:
// Scala3中的新关键字: extension, 用于拓展某类型的方法
extension (literal: String): //冒号可加可不加
def toBaseFromBase(tgtBase: Int, curBase: Int = 10): String =
import scala.math._
val ls1 = (0 until 66).toList
val ls2 = ('0' to '9') :++ ('a' to 'z') :++ ('A' to 'Z') :++ List('+', '-', '*', '/')
val map1To2 = (ls1.take(tgtBase) zip ls2.take(tgtBase)).toMap
val map2To1 = (ls2.take(curBase) zip ls1.take(curBase)).toMap
var numBase10: BigInt = 0
for c <- literal do
numBase10 = numBase10 * curBase + map2To1(c)
var lsRes = List[Char]()
while numBase10 > 0 do
lsRes :+= map1To2((numBase10 % tgtBase).toInt)
numBase10 /= tgtBase
lsRes.reverse.map(_.toString).reduce(_ + _)
// Test
val test = "HelloWorld".toBaseFromBase(10, 62)
}
Scala试水: 实现2进制~66进制之间任意进制的转换
最新推荐文章于 2022-06-16 10:48:31 发布
该博客探讨了使用 Scala 进行数字字面量的进制转换,包括从任意进制转换到目标进制。作者实现了一个名为 `strNumToBaseFromBase` 的函数,能够处理字符串形式的数字并进行进制转换。此外,还展示了 Scala3 的新语法 `extension`,用于给字符串类型拓展自定义方法,简化代码。通过示例测试验证了转换的正确性。
719

被折叠的 条评论
为什么被折叠?



