是否有更好的方法将数字转换为字母等价物?
private String getCharForNumber(int i) {
char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
if (i > 25) {
return null;
}
return Character.toString(alphabet[i]);
}
也许还可以处理超过26的数字?
答案 0 :(得分:54)
只需使用ASCII表示。
private String getCharForNumber(int i) {
return i > 0 && i < 27 ? String.valueOf((char)(i + 64)) : null;
}
注意:这假定i
介于1
和26
之间。
如果您希望i > -1 && i < 26
从零开始,则必须将条件更改为65
,将增量更改为i
。
以下是完整的ASCII表格,以防您需要参考:
修改强>
正如一些人在这里建议的那样,直接使用字符'A'
代替其ASCII代码更具可读性。
private String getCharForNumber(int i) {
return i > 0 && i < 27 ? String.valueOf((char)(i + 'A' - 1)) : null;
}
答案 1 :(得分:19)
对于0-25之外的输入,我有时会发现有一个明确定义的字符串,而不是给出错误或某些标记值(例如&#39;?&#39;)。我喜欢使用以下内容:
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代码,包括使用字母数字(base 36)或区分大小写(base 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
答案 2 :(得分:4)
如果您将/ A定义为0
char res;
if (i>25 || i<0){
res = null;
}
res = (i) + 65
}
return res;
对于首字母超过65;
97非浮动
答案 3 :(得分:4)
我会返回一个字符char
而不是字符串。
public static char getChar(int i) {
return i<0 || i>25 ? '?' : (char)('A' + i);
}
注意:当字符解码器无法识别字符时,它会返回?
我会使用'A'
或'a'
而不是查找ASCII码。
答案 4 :(得分:1)
就个人而言,我更喜欢
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;
只是为了表明你正在检查它是否是一个字母字符。
答案 5 :(得分: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为他们自己的目的,你可以扭转变化,或者只是增加价值++;在整个方法的开头。
答案 6 :(得分:1)
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;
}
}
答案 7 :(得分:1)
从int获取字母值可以通过以下方式完成:
(char)('@' + i)
答案 8 :(得分:0)
您可以尝试这样:
private String getCharForNumber(int i) {
CharSequence css = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (i > 25) {
return null;
}
return css.charAt(i) + "";
}
答案 9 :(得分:0)
另一种变体:
private String getCharForNumber(int i) {
if (i > 25 || i < 0) {
return null;
}
return new Character((char) (i + 65)).toString();
}
答案 10 :(得分:0)
您可以将输入转换为基数26(Hexavigesimal)并将每个“数字”单独转换回基数10并应用ASCII映射。由于A被映射到0,您将得到结果A,B,C,...,Y,Z,BA,BB,BC,...等,根据您对输入值的要求,这可能是也可能不合适&GT; 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;
}
答案 11 :(得分: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));
}
}
}
答案 12 :(得分:0)
从0
开始并返回String
public static String getCharForNumber(int i) {
return i < 0 || i > 25 ? "?" : String.valueOf((char) ('A' + i));
}
答案 13 :(得分: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);
}
答案 14 :(得分:0)
for(int i=0;i<ar.length();i++) {
char ch = ar.charAt(i);
System.out.println((char)(ch+16));;
}