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进制之间任意进制的转换
最新推荐文章于 2023-04-03 01:09:31 发布