2010-11-24 4 views
9

Je veux changer les lettres A en 1 et donc la lettre Z être le numéro 26, puis changé à nouveau en nombre 27 lettres AA, AB à 28. Comment le faire? Dois-je utiliser le "commutateur"? J'utilise le programme Java.Convertir une lettre en chiffres

+2

D'abord, vous devez définir le "changement" . Ensuite, vous devez nous dire ce que vous avez essayé et ce qui ne fonctionne pas. Est-ce censé fonctionner pour n'importe quelle chaîne de longueur? – Falmarri

+0

Pouvez-vous m'aider comment mettre snapshot java ici? – Leostrada

+0

Vous pouvez envisager: http://stackoverflow.com/questions/763691/programming-riddle-how-might-you-translate-an-excel-column-name-to-a-number que cette opération est l'inverse . En fait, voté pour fermer - c'est exactement la moitié du problème résolu. –

Répondre

9

n'a pas testé, mais quelque chose le long de ces lignes devrait fonctionner:

public String numberToCharacterRepresentation(int number) { 
    char[] ls = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); 
    String r = ""; 
    while(true) { 
    r = ls[number % 26] + r; 
    if(number < 26) { 
     break; 
    } 
    number /= 26; 
    } 
    return r; 
} 

L'inverse:

public int stringToNumber(String str) { 
    char[] ls = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); 
    Map<Character, Integer> m = new HashMap<Character, Integer>(); 
    int j = 0; 
    for(char c: ls) { 
    m.put(c, j++); 
    } 
    int i = 0; 
    int mul = 1; 
    for(char c: new StringBuffer(str).reverse().toString().toCharArray()) { 
    i += m.get(c) * mul; 
    mul *= ls.length; 
    } 
    return i; 
} 
+0

Wow merci: D. Mais comment convertir un exemple de lettre suivante AA = 27, AB = 28, AC = 29, AD = 30? – Leostrada

+0

Comment faire un snapshot java comme ça? – Leostrada

+1

@Jonathon Merci pour les jolies retouches! @Leostrada stringToNumber devrait vous donner l'inverse. Vous devriez lire à propos des conversions de base de nombre, car il s'agit essentiellement d'une conversion de base 26 à base 10. Voici un exemple de lien: http://www.cut-the-knot.org/recurrence/conversion.shtml –

0

Comment l'utilisation de c-'A '+ 1 pour convertir la lettre c au nombre que vous voulez? Calculer l'endroit suivant serait le même sauf ajouter 27 à la place. Fondamentalement, ce que vous faites est de convertir un nombre de base-26 en décimal, sauf que vous n'avez pas de zéro.

+0

c-'A '+ 1 signifie si j'écris AA puis sera converti en 27? – Leostrada

0

Cela fera le travail.

public String map(int i) { 
    String res = ""; 
    if (i <= 0) { 
     throw new IllegalArgumentException("Can only map +ve numbers"); 
    } 
    while (i > 0) { 
     res = Character.toString('A' + ((i - 1) % 26)) + res; 
     i = i/26; 
    } 
    return res; 
} 

Une version plus compliquée à l'aide d'un StringBuilder serait plus efficace, mais celui-ci est plus facile à comprendre.

+0

Comment faire un snapshot java comme ça? – Leostrada

+0

@Leostrada - Je ne comprends pas votre question. –

+0

Il demande comment formater le code sur SO. –

0

Peut-être la façon la plus simple pour A-Z serait quelque chose comme:

char c = *whatever letter you need*; 
int cAsInt = Integer.toString(c - '@'); // @ is 1 less than A 

Pour des choses comme AA, BB, etc., il dépendra de combien de combinaisons dont vous avez besoin. Configurer un mapping peut être le plus rapide, mais si les possibilités sont infinies, vous devrez trouver une formule.

1

Utilisez l'objet de caractères 0 => 0 a => 10, etc. Si vous utilisez uniquement des lettres déduisez 10

Character.forDigit(10,Character.MAX_RADIX) //will return 'a' 
Character.getNumericValue('a') // will return 10 
1

Une solution simple consiste à traiter le problème comme écrire des lettres au lieu de chiffres.

public static String asLetters(long num) { 
    StringBuilder sb = new StringBuilder(); 
    while(num > 0) { 
     sb.append((char) ('@' + num % 26)); 
     num /= 26; 
    } 
    return sb.toString(); 
} 
+0

par intérêt, quelle est la signification du @? – Toby

+0

''@'' est ''A '- 1' –

0
import javax.swing.JOptionPane; 

public class TBesar{ 

    public static long x(int a, int b){ 
     if (b==0){ 
      return(1); 
     } 
     else{ 
      return(a*(x(a,(b-1)))); 
     } 
    } 
    public static long KatakeAngka(String nama){ 
     int A = 0; 
     int B = 26; 
     long C = 0; 
     long Z; 
     int panjang = nama.length(); 
     char namas[] = new char[panjang]; 
     for (int i=0;i<panjang;i++){ 
     namas[i] = nama.charAt(i); 
      switch (namas[i]){ 
       case 'a' : A=1;break; 
       case 'b' : A=2;break; 
       case 'c' : A=3;break; 
       case 'd' : A=4;break; 
       case 'e' : A=5;break; 
       case 'f' : A=6;break; 
       case 'g' : A=7;break; 
       case 'h' : A=8;break; 
       case 'i' : A=9;break; 
       case 'j' : A=10;break; 
       case 'k' : A=11;break; 
       case 'l' : A=12;break; 
       case 'm' : A=13;break; 
       case 'n' : A=14;break; 
       case 'o' : A=15;break; 
       case 'p' : A=16;break; 
       case 'q' : A=17;break; 
       case 'r' : A=18;break; 
       case 's' : A=19;break; 
       case 't' : A=20;break; 
       case 'u' : A=21;break; 
       case 'v' : A=22;break; 
       case 'x' : A=23;break; 
       case 'w' : A=24;break; 
       case 'y' : A=25;break; 
       case 'z' : A=26;break; 
      } 
      int D = panjang-(i+1); 
      Z = (x(B,D))*A; 
      C = C+Z; 
     }return(C); 
    } 
    public static String hitung(long angka){ 
     String B ; 
     if(angka<27){ 
      if(angka==1){ 
       B="a"; 
      }else if(angka==2){ 
       B="b"; 
      }else if(angka==3){ 
       B="c"; 
      }else if(angka==4){ 
       B="d"; 
      }else if(angka==5){ 
       B="e"; 
      }else if(angka==6){ 
       B="f"; 
      }else if(angka==7){ 
       B="g"; 
      }else if(angka==8){ 
       B="h"; 
      }else if(angka==9){ 
       B="i"; 
      }else if(angka==10){ 
       B="j"; 
      }else if(angka==11){ 
       B="k"; 
      }else if(angka==12){ 
       B="l"; 
      }else if(angka==13){ 
       B="m"; 
      }else if(angka==14){ 
       B="n"; 
      }else if(angka==15){ 
       B="o"; 
      }else if(angka==16){ 
       B="p"; 
      }else if(angka==17){ 
       B="q"; 
      }else if(angka==18){ 
       B="r"; 
      }else if(angka==19){ 
       B="s"; 
      }else if(angka==20){ 
       B="t"; 
      }else if(angka==21){ 
       B="u"; 
      }else if(angka==22){ 
       B="v"; 
      }else if(angka==23){ 
       B="w"; 
      }else if(angka==24){ 
       B="x"; 
      }else if(angka==25){ 
       B="y"; 
      }else{B="z";} 
      return(B); 
     } 
     else{ 
      return(hitung(angka/26)+hitung(angka%26)); 
     } 
    } 
    public static void main (String [] args){ 
     String kata = JOptionPane.showInputDialog(null,"Masukkan Kata ke 1"); 
     String kata2 = JOptionPane.showInputDialog(null, "Masukkan Kata ke 2"); 
     long hasil = KatakeAngka(kata); 
     long hasil2 = KatakeAngka(kata2); 
     long total = hasil+hasil2; 

     String HasilKata = hitung(total); 
     JOptionPane.showMessageDialog(null,kata+" = "+hasil+"\n"+kata2+" = "+hasil2+"\n"+kata+" + "+kata2+" = "+HasilKata); 
    } 
} 
1

Pour ceux qui veulent le faire pour Excel:

public String getEquivColumn(int number){ 
    String converted = ""; 
    // Repeatedly divide the number by 26 and convert the 
    // remainder into the appropriate letter. 
    while (number >= 0) 
    { 
     int remainder = number % 26; 
     converted = (char)(remainder + 'A') + converted; 
     number = (number/26) - 1; 
    } 

    return converted; 
} 
0

Cela fonctionne pour A à ZZ:

public static int columnCharToNumber(String str) { 
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    if(str.length() == 1) { 
     return alphabet.indexOf(str); 
    } 
    if(str.length() == 2) { 
     return (alphabet.indexOf(str.substring(1)) + 26*(1+alphabet.indexOf(str.substring(0,1)))) ; 
    } 
    return -1; 
} 
+0

Salut Arif, bienvenue à SO et merci pour votre réponse. Pour rendre votre réponse encore plus utile, est-ce que cela vous dérangerait de l'éditer (modifier le lien juste en dessous de la réponse) pour ajouter une explication de «pourquoi» ce code résout le problème? Cela aidera les gens à apprendre et à appliquer la solution à d'autres situations, plutôt que d'encourager simplement le codage copier-coller. Merci encore! –

Questions connexes