如何将一个十进制数字转换为 HTML 排序列表中的字母序号

10

我想将一个整数转换为字母表中对应的字母,就像HTML有序列表中的排序一样。

<ol type="a">

我曾尝试将一个十进制数转换成基于 a-z 的 26 进制。
但那不是我想要的。
IN     WANT        GET      
-----------------------
1   =>  a       <=  a
2   =>  b       <=  b
3   =>  c       <=  c
4   =>  d       <=  d
5   =>  e       <=  e
6   =>  f       <=  f
7   =>  g       <=  g
8   =>  h       <=  h
9   =>  i       <=  i
10  =>  j       <=  j
11  =>  k       <=  k
12  =>  l       <=  l
13  =>  m       <=  m
14  =>  n       <=  n
15  =>  o       <=  o
16  =>  p       <=  p
17  =>  q       <=  q
18  =>  r       <=  r
19  =>  s       <=  s
20  =>  t       <=  t
21  =>  u       <=  u
22  =>  v       <=  v
23  =>  w       <=  w
24  =>  x       <=  x
25  =>  y       <=  y
26  =>  z       <=  az
27  =>  aa      <=  aa
28  =>  ab      <=  ab
29  =>  ac      <=  ac

private final static char[] digits = {
'0' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 
'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 
'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 
's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z'
};

private static String numberToAlphaNumeric(long i, int radix) {

    char[] buf = new char[65];
    int charPos = 64;
    boolean negative = (i < 0);
    if (!negative) {
        i = -i;
    }
    while (i <= -radix) {
        buf[charPos--] = digits[(int)(-(i % radix))];
        i = i / radix;
    }
    buf[charPos] = digits[(int)(-i)];
    if (negative) { 
        buf[--charPos] = '-';
    }
    return new String(buf, charPos, (65 - charPos));
}

public static String numberToAlphaNumeric(long number) {
    ArrayList<String> list = new ArrayList<String>();
    for( int j = 0; list.size() != number; j++ ) {
        String alpha = numberToAlphaNumeric( j, digits.length );
        if(!alpha.contains( "0" )) {
            list.add( alpha );
        }
    }
    return list.get( list.size()-1 );
}

我的第二个想法:

如果我给数字添加一个新的前导符号并将其转换为27进制数,那么每次进位都会有新的符号,这是错误的,我可以将这些过滤掉。

这非常低效和丑陋,但我已经没有更多的想法了。通常的方法是什么?


你已经展示了一些你不想要的结果 - 据我所知,只有26个失败的结果 - 但是没有展示代码是什么... - Jon Skeet
4
因为你的0应该映射为字母'a'。 - perilbrain
我刚刚测试了使用list-style: lower-alpha,26应该只是z,而不是az - Ben Taitelbaum
@Ben 是的,我想要26只是'z',27是'aa'。 - oliholz
1
请修改您的帖子,它并没有这么说。 - user207421
我想将IntStream映射到这种输出。这个问题帮助我理解A-Z,AA-ZZ,AAA-ZZZ不是简单的26进制(因为“A”不等于“AA”),但也不是27进制(因为我们不想要“A”,“A ”等)。 - charles-allen
2个回答

14

这是基本算法。如果您需要更高效的算法,请使用StringBuffer:

  public static String getAlpha(int num) {

    String result = "";
    while (num > 0) {
      num--; // 1 => a, not 0 => a
      int remainder = num % 26;
      char digit = (char) (remainder + 97);
      result = digit + result;
      num = (num - remainder) / 26;
    }

    return result;
  }

另一种方法是将字符串转换为26进制,然后对得到的每个字符加上97。


2
将 A 到 Z 存储在数组索引中,从 1 到 26 开始,例如 alphArr[]。
i = Input

If(i<26){
  Print alphArr[i]
  }else{
  //Consider i=27
  count = i/26  (here, count=1)
  alphabet = i%26  (here alphabet =1)
  print alphArr[count]+””+alphArr[alphabet] // Which will be “AA”
}

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