Как мне преобразовать число в букву на Java?
Есть ли лучший способ преобразования числа в его алфавитный эквивалент?
private String getCharForNumber(int i) {
char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
if (i > 25) {
return null;
}
return Character.toString(alphabet[i]);
}
Может быть, что-то, что может иметь дело с цифрами, более чем более элегантными?
Ответы
Ответ 1
Просто используйте представление 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, если вам нужно обратиться к:
![enter image description here]()
Edit:
Как некоторые люди предложили здесь, гораздо более читаемым для непосредственного использования символа 'A'
вместо его кода ASCII.
private String getCharForNumber(int i) {
return i > 0 && i < 27 ? String.valueOf((char)(i + 'A' - 1)) : null;
}
Ответ 2
Вместо того, чтобы давать ошибку или какое-либо значение дозорного (например, "?" ) для входов вне 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
Ответ 3
если вы определяете a/A как 0
char res;
if (i>25 || i<0){
res = null;
}
res = (i) + 65
}
return res;
65 для капителей;
97 для не-захватов
Ответ 4
Я бы вернул символ char
вместо строки.
public static char getChar(int i) {
return i<0 || i>25 ? '?' : (char)('A' + i);
}
Примечание: когда декодер символов не распознает символ, он возвращает ?
Я бы использовал 'A'
или 'A'
вместо поиска ASCII-кодов.
Ответ 5
Лично я предпочитаю
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;
чтобы убедиться, что вы проверяете его буквенный символ.
Ответ 6
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 для собственных целей, вы можете отменить изменения или просто добавить значение ++; в начале всего метода.
Ответ 7
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;
}
}
Ответ 8
Получение алфавитного значения из int может быть просто выполнено с помощью
(char)('@' + i)
Ответ 9
Вы можете попробовать вот так:
private String getCharForNumber(int i) {
CharSequence css = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (i > 25) {
return null;
}
return css.charAt(i) + "";
}
Ответ 10
Другой вариант:
private String getCharForNumber(int i) {
if (i > 25 || i < 0) {
return null;
}
return new Character((char) (i + 65)).toString();
}
Ответ 11
Вы можете преобразовать входной сигнал в базу 26 (Hexavigesimal) и преобразовать каждую цифру обратно в базу 10 отдельно и применить сопоставление ASCII. Поскольку A отображается в 0, вы получите результаты A, B, C,..., Y, Z, BA, BB, BC,... и т.д., Которые могут быть или не быть желательными в зависимости от ваших требований к входным значениям > 26, так как естественно думать, что АА появляется после 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;
}
Ответ 12
Это не совсем ответ, но какой-то полезный/связанный код, который я сделал. Когда вы запускаете его и вводите любой символ в командной строке, он возвращает 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));
}
}
}
Ответ 13
Другой подход, начинающийся с 0
и возвращающий String
public static String getCharForNumber(int i) {
return i < 0 || i > 25 ? "?" : String.valueOf((char) ('A' + i));
}