Преобразовать целое число в эквивалент упорядоченного списка альфа - PullRequest
0 голосов
/ 17 сентября 2011

Мне нужна функция для преобразования целого числа в эквивалентный индекс упорядоченного списка альфа.Например:

1 = a2 = б,,,26 = z27 = аа28 = ab,,и т.п.

В настоящее время у меня есть следующее, которое почти работает, но где-то есть небольшая логическая ошибка, которая делает его не совсем правильным (идет топор, да, bz , ba, bb, bc ...):

function intToAlpha( int ) {

    var asciiStart = 97,
        alphaMax = 26,
        asciiCode,
        char,
        alpha = '',
        place,
        num,
        i;

    for ( i = 0; Math.pow(alphaMax, i) < int; i++ ) {

        place = Math.pow(alphaMax, i);        
        num = Math.floor( ( int / place ) % alphaMax);
        asciiCode = ( num == 0 ? alphaMax : num ) + asciiStart - 1;
        char = String.fromCharCode(asciiCode);
        alpha = char + alpha;

    }

    return alpha;
}

for (i = 1; i < 300; i++) {
    console.log( i + ': ' + intToAlpha(i) );
}

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

Эта функция используется в NVu / Kompozer / SeaMonkey Composer с небольшой настройкой для непосредственного генерирования строчных букв:

function ConvertArabicToLetters(num)
{
  var letters = "";
  while (num > 0) {
    num--;
    letters = String.fromCharCode(97 + (num % 26)) + letters;
    num = Math.floor(num / 26);
  }
  return letters;
}
1 голос
/ 17 сентября 2011

Вы должны убедиться, что используете правильное значение при приеме мода.

function intToAlpha( int ) {
var asciiStart = 97,
    alphaMax = 26,
    asciiCode,
    char,
    alpha = "";
    while(int > 0) {
        char = String.fromCharCode(asciiStart + ((int-1) % alphaMax));
        alpha = char + alpha;
        int = Math.floor((int-1)/26);
    }
    return alpha;
}
0 голосов
/ 17 сентября 2011

Некоторое время назад мне нужно было то же самое в SQL, поэтому я задал (и ответил) вопрос Многоосновное преобразование - использование всех комбинаций для сокращения URL .

.усложняет то, что это не прямое базовое преобразование, поскольку нет символа, представляющего нулевую цифру.

Я преобразовал функцию SQL в Javascript:

function tinyEncode(id) {

  var code, value, adder;

  var chars = 'abcdefghijklmnopqrstuvwxyz';

  if (id <= chars.length) {
    code = chars.substr(id - 1, 1);
  } else {
    id--;
    value = chars.length;
    adder = 0;
    while (id >= value * (chars.length + 1) + adder) {
      adder += value;
      value *= chars.length;
    }
    code = chars.substr(Math.floor((id - adder) / value) - 1, 1);
    id = (id - adder) % value;
    while (value > 1) {
      value = Math.floor(value / chars.length);
      code += chars.substr(Math.floor(id / value), 1);
      id = id % value;
    }
  }
  return code;
}

Демонстрация: http://jsfiddle.net/Guffa/mstBe/

...