Scala试水: 实现2进制~66进制之间任意进制的转换

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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值