我想要实现的是通过使用自定义字母表(可以是 UTF-8 字符的任意子集)而不是数字 0-9 来更改正整数的文本表示形式。我想这与使用大小为 N 的字母表(而不是 A-Z 和 0-9)将 base10 数字转换为 baseN 数字是一样的。
在 Scala/Java 中,将 10 进制数字转换为其他进制并不困难(例如使用 Integer.toString(number, radix)
),但上限是 base36 并且没有使用自定义字符的方法。有没有一种优雅的方法来做到这一点?
最佳答案
Scala 不会为你做这件事。
但是只要您的数字采用数字表示形式(例如 Long),数学就非常简单。我在这里只考虑积极的情况;负数需要几个减号。
def baseString(number: Long): String = {
var x = number
var myDigits = List.empty[Char]
while (x > 0) {
myDigits = lookup(x % base) :: myDigits
x = x / base
}
myDigits.mkString
}
现在您有一个包含号码数字的列表(按顺序),假设 lookup
是一个获取数字值并生成字符表示形式的函数。
要读出数字,倒过来也是一样的。如果您的数字已在列表中,则
def stringBase(text: String): Long = {
var x = 0L // Assuming Long, but pick the right type
var dig = text.toList
while (dig.nonEmpty) {
x = x * base + reverseLookup(dig.head)
dig = dig.tail
}
x
}
现在你已经拿回了你的号码。 (reverseLookup
获取字符并生成相应的数值。)
您可以使用以下内容进行测试(尽管您可能希望对无效值引发异常):
val base = 2
def lookup(i: Long) = i match { case 0 => 'f'; case _ => 't' }
def reverseLookup(c: Char) = c match { case 'f' => 0L; case _ => 1L }
关于java - 使用大小为 N 的自定义字母表将基数 10 的数字转换为基数 (Scala),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33105434/