如何在Java中将数字转换为字母?
是否有更好的方法将数字转换为字母等价物?
private String getCharForNumber(int i) { char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); if (i > 25) { return null; } return Character.toString(alphabet[i]); }
也许还可以处理超过26的数字呢?
只需使用ASCII表示。
private String getCharForNumber(int i) { return i > 0 && i < 27 ? String.valueOf((char)(i + 64)) : null; }
注意:这假设i
在1
到26
之间(包括1
和26
。
您必须将条件更改为i > -1 && i < 26
,如果您希望i
从零开始,则将增量更改为65
。
这是完整的ASCII表,以防您需要参考:
编辑:
正如一些人在这里建议的那样,直接使用字符'A'
代替其ASCII代码更具可读性。
private String getCharForNumber(int i) { return i > 0 && i < 27 ? String.valueOf((char)(i + 'A' - 1)) : null; }
我没有给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
我会返回一个字符char
而不是字符串。
public static char getChar(int i) { return i<0 || i>25 ? '?' : (char)('A' + i); }
注意:当字符解码器无法识别它返回的字符时?
我会使用'A'
或'a'
而不是查找ASCII码。
如果将a / A定义为0
char res; if (i>25 || i<0){ res = null; } res = (i) + 65 } return res;
65为captitals; 97非浮动
就个人而言,我更喜欢
return "ABCDEFGHIJKLMNOPQRSTUVWXYZ".substring(i, i+1);
它共享支持char[]
。 或者,我认为下一个最可读的方法是
return Character.toString((char) (i + 'A'));
这不依赖于记住ASCII表。 它没有做validation,但如果你愿意,我宁愿写
char c = (char) (i + 'A'); return Character.isUpperCase(c) ? Character.toString(c) : null;
只是为了让你明白你正在检查它是一个字母字符。
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,你可以反转变化,或者只是添加值++; 在整个方法的开头。
从int获取字母值可以简单地完成:
(char)('@' + i)
另一个变种:
private String getCharForNumber(int i) { if (i > 25 || i < 0) { return null; } return new Character((char) (i + 65)).toString(); }
您可以将输入转换为基数26(Hexavigesimal)并将每个“数字”单独转换回基数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; }
这不是一个答案,而是我制作的一些有用/相关的代码。 当你运行它并在命令行中输入任何字符时,它返回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)); } } }
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; } }
另一种从0
开始并返回String
public static String getCharForNumber(int i) { return i < 0 || i > 25 ? "?" : String.valueOf((char) ('A' + i)); }
你可以尝试这样:
private String getCharForNumber(int i) { CharSequence css = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (i > 25) { return null; } return css.charAt(i) + ""; }