使用Java的Integer.toString()将Base 10转换为Base 26字母表达式

10
我刚学会了Integer.toString(int x, int radix);,觉得它非常棒,因为它可以使基数转换变得超级简单。
然而,我正在尝试按Base-26(a-z)的语音方式写作,并注意到Integer.toString()遵循十六进制的例子,即从数字开始,然后使用字母(0-p)。
我已经知道如何手动转换为Base-26,不需要那段代码。但我想知道是否有一种方法可以利用Integer.toString(),因为它几乎已经完成了所有繁重的工作。
有什么想法吗?

如果您提出关于具体代码的具体问题,您将获得更有用的结果。 - Jon Kiparsky
4个回答

8
你可以迭代一个 char[] 数组,将 Integer.toString 的输出转换为你想要的范围。
public static String toAlphabeticRadix(int num) {
    char[] str = Integer.toString(num, 26).toCharArray();
    for (int i = 0; i < str.length; i++) {
        str[i] += str[i] > '9' ? 10 : 49;
    }
    return new String(str);
}

Ideone Demo


1
有没有办法让26以"aa"开头,而不是"ba"?顺便说一下,谢谢。 - forgetfulbur
1
只要你把"a"解释为"0",那么"ba"就是正确的输出,因为它等同于"10"。 - 4castle
@forgetfulbur 检查它是否以b开头,然后进行更改。 - sam1370

0

不是的; 这种方法的实现方式 有效地保证它从0-9开始,然后通过a-f进行,如果基数超过16,则继续进行。

如果您想以自己的方式执行此操作,则需要自行执行偏移量。


我想这就是情况。有没有聪明的方法来执行已转换数据的偏移量?当然,除了蛮力方法之外。 - forgetfulbur
一个 char 可以被添加,因此如果您想将 'A''a' 定义为 0,则偏移量变得容易处理。 - Makoto

0
这是Scala,但它可以根据正确的流程从Z到AA,以及从ZZ到AAA完成你想要的操作。之前示例中的Java代码有错误,并且只计数到Y,而不是Z。
重要的是要从1开始计数,而不是零。这种计数系统没有"0"。
  def gen_symbols: LazyList[String] = LazyList.from(1).map { i_ =>
    val buf = new java.lang.StringBuffer
    var i = i_
    while (i > 0) {
      val rem = (i - 1) % 26
      buf.append(('A' + rem).toChar)
      i = (i - rem) / 26
    }
    buf.reverse.toString
  }

0
如果你想要26=aa而不是ba,那么这里是一些你可以使用的代码。
这是4castle在这个帖子中发布的代码的修改版。
public static String toAlphabeticRadix(int num) {
    char[] str = Integer.toString(num, 26).toCharArray();
    for (int i = 0; i < str.length; i++) {
        str[i] += (str[i] > '9' ? 10 : 49) - (num > 25 && i < 1 ? 1 : 0);
    }
    return new String(str);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接