Вопрос по java – Как мне преобразовать число в букву на Java?

27

Есть ли лучший способ преобразования числа в его буквенный эквивалент, чем этот?

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

Может быть, что-то, что может иметь дело с числами больше 26, тоже более элегантно?

Какой вариант использования для этого и числа больше 25? Возможно, есть другой способ. Ewald
Какое значение вы ожидаете для числа больше 26? adarshr
Я не нуждаюсь в числах больше 26. В данный момент одновременно отображаются только 10 результатов, но их может потребоваться увеличить до 20. Хотя это выглядело лучше, просто включить весь алфавит. Я не был уверен, что какая-нибудь библиотека Apache Commons может сделать это в одну строку (я делал Google вокруг). edwardmlyte

Ваш Ответ

13   ответов
4

char вместо строки.

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

Примечание: когда декодер символов не распознает символ, он возвращает?

я хотел бы использовать'A' или же'a' вместо поиска кодов ASCII.

Error: User Rate Limit Exceeded
0

бразовать каждую «цифру» вернуться к основанию 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;
}
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;
        }
    }
4

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

65 для столиц; 97 для не столиц

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;

просто чтобы было очевидно, что вы проверяете, что это алфавитный символ.

Error: User Rate Limit Exceededchar[]Error: User Rate Limit Exceeded
0

private String getCharForNumber(int i) {
    CharSequence css = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if (i > 25) {
        return null;
    }
    return css.charAt(i) + "";
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/8445311/…
Error: User Rate Limit ExceededStringError: User Rate Limit Exceeded
Error: User Rate Limit ExceededStringError: User Rate Limit ExceededStringError: User Rate Limit ExceededCharSequence.
Error: User Rate Limit ExceededCharSequenceError: User Rate Limit ExceededString?
1
public static string IntToLetters(int value)
{
string result = string.Empty;
while (--value >= 0)
{
    result = (char)('A' + value % 26 ) + result;
    value /= 26;
}
return result;
}

я добавил - к условию цикла while и удалил значение - из конца цикла, если кто-то хочет, чтобы это было 0 для их собственных целей, вы можете отменить изменения или просто добавить значение ++; в начале всего метода.

0

private String getCharForNumber(int i) {
    if (i > 25 || i < 0) {
        return null;
    }
    return new Character((char) (i + 65)).toString();
}
19

чтобы выдавать ошибку или какое-либо дозорное значение (например, «?») Для входных данных, выходящих за пределы 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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
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));
     }
    }
}
52

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;
}
0

0 и возвращаяString

public static String getCharForNumber(int i) {
    return i < 0 || i > 25 ? "?" : String.valueOf((char) ('A' + i));
}
1

(char)('@' + i)
Error: User Rate Limit Exceeded

Похожие вопросы