40

有没有比这更好的将数字转换为其字母等价物的方法?

private String getCharForNumber(int i) {
    char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    if (i > 25) {
        return null;
    }
    return Character.toString(alphabet[i]);
}

也许比处理大于 26 的数字更优雅的东西?

4

16 回答 16

79

只需使用 ASCII 表示。

private String getCharForNumber(int i) {
    return i > 0 && i < 27 ? String.valueOf((char)(i + 64)) : null;
}

注意:这假设i介于126包含之间。

如果您想从零开始,您必须将条件更改为i > -1 && i < 26和增量。65i

这是完整的 ASCII 表,以防您需要参考:


在此处输入图像描述


编辑:

正如一些人在这里建议的那样,直接使用字符'A'而不是其 ASCII 代码更具可读性。

private String getCharForNumber(int i) {
    return i > 0 && i < 27 ? String.valueOf((char)(i + 'A' - 1)) : null;
}
于 2012-05-30T09:11:30.200 回答
36

对于 0-25 之外的输入,我有时会发现为所有整数提供一个明确定义的字符串,而不是给出错误或一些标记值(例如“?”)。我喜欢使用以下内容:

   0 ->    A
   1 ->    B
   2 ->    C
 ...
  25 ->    Z
  26 ->   AA
  27 ->   AB
  28 ->   AC
 ...
 701 ->   ZZ
 702 ->  AAA
 ...

这也可以扩展到负数:

  -1 ->   -A
  -2 ->   -B
  -3 ->   -C
 ...
 -26 ->   -Z
 -27 ->  -AA
 ...

Java 代码:

public static String toAlphabetic(int i) {
    if( i<0 ) {
        return "-"+toAlphabetic(-i-1);
    }

    int quot = i/26;
    int rem = i%26;
    char letter = (char)((int)'A' + rem);
    if( quot == 0 ) {
        return ""+letter;
    } else {
        return toAlphabetic(quot-1) + letter;
    }
}

Python 代码,包括使用字母数字(基数 36)或区分大小写(基数 62)字母的能力:

def to_alphabetic(i,base=26):
    if base < 0 or 62 < base:
        raise ValueError("Invalid base")

    if i < 0:
        return '-'+to_alphabetic(-i-1)

    quot = int(i)/base
    rem = i%base
    if rem < 26:
        letter = chr( ord("A") + rem)
    elif rem < 36:
        letter = str( rem-26)
    else:
        letter = chr( ord("a") + rem - 36)
    if quot == 0:
        return letter
    else:
        return to_alphabetic(quot-1,base) + letter
于 2015-05-15T12:38:04.627 回答
5

我会返回一个字符char而不是一个字符串。

public static char getChar(int i) {
    return i<0 || i>25 ? '?' : (char)('A' + i);
}

注意:当字符解码器无法识别字符时,它会返回?

我会使用'A'or'a'而不是查找 ASCII 代码。

于 2012-05-30T09:19:11.297 回答
4

如果您将 a/A 定义为 0

char res;
if (i>25 || i<0){
    res = null;
}
    res = (i) + 65
}
return res;

大写字母 65;非大写字母 97

于 2012-05-30T09:12:57.923 回答
4

就个人而言,我更喜欢

return "ABCDEFGHIJKLMNOPQRSTUVWXYZ".substring(i, i+1);

这股靠山char[]。或者,我认为下一个最易读的方法是

return Character.toString((char) (i + 'A'));

这不依赖于记住 ASCII 表。它不做验证,但如果你愿意,我宁愿写

char c = (char) (i + 'A');
return Character.isUpperCase(c) ? Character.toString(c) : null;

只是为了清楚地表明您正在检查它是一个字母字符。

于 2012-05-30T09:14:40.130 回答
2
public static String abcBase36(int i) {
    char[] ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    int quot = i / 36;
    int rem = i % 36;

    char letter = ALPHABET[rem];
    if (quot == 0) {
        return "" + letter;
    } else {
        return abcBase36(quot - 1) + letter;
    }
}
于 2015-10-16T09:14:40.167 回答
1

您可以将输入转换为基数 26(十六进制)并将每个“数字”单独转换回基数 10 并应用 ASCII 映射。由于 A 映射到 0,您将得到结果 A、B、C、...、Y、Z、BA、BB、BC、...等,根据您对输入值的要求,可能需要也可能不需要> 26,因为很自然地认为 AA 在 Z 之后。

public static String getCharForNumber(int i){

    // return null for bad input
    if(i < 0){
        return null;
    }

    // convert to base 26
    String s = Integer.toString(i, 26);

    char[] characters = s.toCharArray();

    String result = "";
    for(char c : characters){
        // convert the base 26 character back to a base 10 integer
        int x = Integer.parseInt(Character.valueOf(c).toString(), 26);
        // append the ASCII value to the result
        result += String.valueOf((char)(x + 'A'));          
    }

    return result;
}
于 2013-05-08T13:27:10.420 回答
1
public static string IntToLetters(int value)
{
string result = string.Empty;
while (--value >= 0)
{
    result = (char)('A' + value % 26 ) + result;
    value /= 26;
}
return result;
}

为了满足 A 为 1 而不是 0 的要求,我在 while 循环条件中添加了 - 并删除了值 - 从循环的末尾,如果有人出于自己的目的希望它为 0,你可以扭转变化,或者简单地增加价值++;在整个方法的开始。

于 2015-09-16T12:28:23.390 回答
1

从 int 获取字母值可以简单地通过以下方式完成:

(char)('@' + i)
于 2017-05-24T16:14:02.440 回答
0

你可以这样尝试:

private String getCharForNumber(int i) {
    CharSequence css = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if (i > 25) {
        return null;
    }
    return css.charAt(i) + "";
}
于 2012-05-30T09:18:37.917 回答
0

另一种变体:

private String getCharForNumber(int i) {
    if (i > 25 || i < 0) {
        return null;
    }
    return new Character((char) (i + 65)).toString();
}
于 2012-05-30T09:20:24.667 回答
0

这不完全是答案,而是我制作的一些有用/相关的代码。当您运行它并在命令行中输入任何字符时,它会返回getNumericValue(char)... 这似乎与 ASCII 表不同,因此请注意。无论如何,不​​是直接回答您的问题,但希望对您有所帮助:

import java.lang.*;
import java.util.*;
/* charVal.java
         */

//infinite loops. whenever you type in a character gives you value of 
//getNumericValue(char)
//
//ctrl+c to exit



public class charVal {
   public static void main(String[] args) {
     Scanner inPut = new Scanner(System.in);
     for(;;){
       char c = inPut.next().charAt(0);
       System.out.printf("\n %s = %d \n", c, Character.getNumericValue(c));
     }
    }
}
于 2013-10-28T10:26:56.263 回答
0

另一种方法从0a 开始并返回String

public static String getCharForNumber(int i) {
    return i < 0 || i > 25 ? "?" : String.valueOf((char) ('A' + i));
}
于 2016-07-05T14:11:56.987 回答
0
public static void main(String[] args)
 {
     int rem,n=702,quo;
     String s=" ";
     while(n>0)
     {
         rem=(n-1)%26;
         quo=(n-1)/26;
         s=(char)(rem+97)+s;
         if(quo==1)
         {
            s=(char)(97)+s;
            break;
         }
         else
         n=(n-1)/26;
     }
     System.out.print(s);
 }
}
////We can also write the code like the below one. There is no much difference but it may help to understand the concept for some people.


public static void main(String[] args)
 {
     int rem,n=52,quo;
     String s=" ";
     while(n>0)
     {
         rem=n%26;
         quo=n/26;
         if(rem==0)
             rem=26;
         s=(char)(rem+96)+s;
         if((quo==1 || quo==0) && n>26)
         {
             n=n/26;
            s=(char)(n+96)+s;
            break;
         }
         else
             n=n/26-1; 
     }
     System.out.print(s);
 }
于 2019-10-22T14:02:45.047 回答
0
for(int i=0;i<ar.length();i++) {
            char ch = ar.charAt(i);
                    System.out.println((char)(ch+16));;
        }
于 2020-09-27T10:44:10.387 回答
0

接受的答案最好地描述了解决方案。然而,当您想继续对值 27 进行编号时,它无法处理这种情况,例如aa, ab, ... az, aaa, aab.... 为此,我通过以下方式实现了:

protected String getAlphaNumber(int intValue) {
    if (intValue == 0) {
        return "";
    }
    intValue = Math.abs(intValue);
    String prefix = "";
    int charPosition = intValue % 26;
    int blocks = intValue / 26;
    if (charPosition == 0) { //the last letter, "z" (26)
        blocks--;
        charPosition = 26;
    }
    for (int i = 0; i < blocks; i++) {
        prefix += "a";
    }
    return prefix + ((char) (charPosition + 96)); // "a"-"z" chars are located in the 97-122 indexes of the ASCII table, so shift all 96 positions.
}
于 2021-12-15T11:02:33.127 回答