【问题标题】:How do I convert a number to a letter in Java?如何在 Java 中将数字转换为字母?
【发布时间】:2022-05-18 03:45:12
【问题描述】:

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

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

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

【问题讨论】:

  • 对于大于 26 的数字,您期望什么值?
  • 这个和大于 25 的数字的用例是什么?也许还有其他方法。
  • 我不需要大于 26 的数字。目前一次只显示 10 个结果,但他们可能希望增加到 20 个。认为只包含整个字母表看起来更整洁。我不确定是否有一些 apache commons library 可以在一行中做到这一点(我做了谷歌)。

标签: java


【解决方案1】:

只需使用 ASCII 表示即可。

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

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

如果您希望 i 从零开始,您必须将条件更改为 i &gt; -1 &amp;&amp; i &lt; 26 并将增量更改为 65

这是完整的 ASCII 表,以备不时之需:



编辑:

正如一些人在这里建议的那样,直接使用字符 '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
    

    【讨论】:

    • 如何从字母返回数字?
    • 我没有时间 atm 编写代码,但你基本上会从字符串左侧弹出一个字符,转换为数字 0-25,然后如果还有更多字母乘以 26并递归。这只是一个 base-26 编码,所以数学并不复杂。
    • 我会在几天后发布一个问题,并提供赏金。如果您能编写代码,我会很高兴:D
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案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;
      

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

      【讨论】:

      • 是否共享支持char[]取决于您的Java版本。 :-)
      【解决方案5】:

      如果您将 a/A 定义为 0

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

      65 大写; 97 表示非大写

      【讨论】:

        【解决方案6】:

        从 int 中获取按字母顺序排列的值可以通过以下方式简单完成:

        (char)('@' + i)
        

        【讨论】:

        • 你能把它转换成函数吗?
        【解决方案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】:

          您可以将输入转换为基数 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;
          }
          

          【讨论】:

          • 这是一个非常优雅的解决方案,实际上使用了数学。不幸的是,通过选择用 0 表示 A、用 1 表示 B 等,在 Z (25) 之后没有映射到 AA 的数字。 :-( 它必须从 Z 到 BA。
          【解决方案9】:
          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目的,您可以反转更改,或者简单地添加 value++;在整个方法的开头。

          【讨论】:

            【解决方案10】:

            另一种变体:

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

            【讨论】:

              【解决方案11】:

              这并不完全是一个答案,而是我制作的一些有用/相关的代码。当您运行它并在命令行中输入任何字符时,它会返回 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 开始并返回String 的另一种方法

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

                【讨论】:

                  【解决方案13】:

                  你可以这样试试:

                  private String getCharForNumber(int i) {
                      CharSequence css = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                      if (i > 25) {
                          return null;
                      }
                      return css.charAt(i) + "";
                  }
                  

                  【讨论】:

                  • 使用CharSequence而不是普通的旧String有什么特别的原因吗?
                  • 我认为是内部使用了char数组,字符串操作速度更快。
                  • String 也是如此!希望你意识到String 扩展了CharSequence
                  • 是的。你可以减少内存占用。stackoverflow.com/questions/8445311/…
                  • 我不完全同意。即使是这样,在这种情况下也毫无意义。此外,您在返回之前将整个内容转换为String
                  【解决方案14】:
                  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);
                   }
                  

                  【讨论】:

                  • 请在您的代码中添加一些解释,以便其他人可以从中学习
                  【解决方案15】:
                  for(int i=0;i<ar.length();i++) {
                              char ch = ar.charAt(i);
                                      System.out.println((char)(ch+16));;
                          }
                  

                  【讨论】:

                  • include an explanation for your code,因为这有助于提高您的帖子质量。鉴于已经有很多其他答案,如果您能在此处解释您的答案的优点会很有趣。
                  【解决方案16】:

                  接受的答案最好地描述了解决方案。然而,当您想继续对值 27 进行编号时,它无法处理这种情况,例如 aaab、...azaaaaab.... 为此,我实现了以下目标:

                  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.
                  }
                  

                  【讨论】:

                    【解决方案17】:

                    import java.util.*;
                    
                    class Integer2Letter
                    
                    {
                    
                         void main()
                    
                         {
                    
                             Scanner ob=new Scanner(System.in);
                    
                             int n;
                    
                             System.out.println("Enter an Integer");
                    
                             n=ob.nextInt();//INPUT IN INTEGER FORMAT
                    
                             if(n>0 && n<27)//RANGE CHECK
                    
                             {
                    
                                 char ch= (char)(n+64);//IF N=1 THAN 64+1=65 WHICH EQUAL TO THE ASCII VALUE        OF 'A' 
                    
                                 System.out.println("the corresponding letter is="+ch);
                    
                             }
                    
                             else
                    
                             {
                    
                                 System.out.println("Please enter the correct range");
                    
                             }
                    
                         }
                    
                    }

                    【讨论】:

                      猜你喜欢
                      • 2020-08-24
                      • 2013-05-31
                      • 1970-01-01
                      • 2016-07-07
                      • 1970-01-01
                      • 2015-03-08
                      相关资源
                      最近更新 更多