Dart: как преобразовать букву столбца в число

#dart

Вопрос:

В настоящее время используется Dart с gsheets_api, в котором, похоже, нет функции преобразования букв столбцов в цифры (индекс столбца)

В качестве примера , это то, что я использую с AppScript (ввод: буква столбца, вывод: номер индекса столбца):

 function Column_Nu_to_Letter(column_nu) 
  {
  var temp, letter = '';
  while (column_nu > 0)
    {
      temp = (column_nu - 1) % 26;
      letter = String.fromCharCode(temp   65)   letter;
      column_nu = (column_nu - temp - 1) / 26;
    }
  return letter;
  };
 

Это код, который я придумал для Dart, он работает, но я уверен, что есть более элегантный или правильный способ сделать это.

 String colLetter = 'L'; //Column 'L' as example
int c = "A".codeUnitAt(0);
int end = "Z".codeUnitAt(0);
int counter = 1;
while (c <= end) {
  //print(String.fromCharCode(c));

  if(colLetter == String.fromCharCode(c)){
    print('Conversion $colLetter = $counter');
  }
  counter  ;
  c  ;
}
// this output L = 12 
 

У вас есть какие-либо предложения по улучшению этого кода?

Комментарии:

1. Ваш текст запрашивает преобразование букв в индекс, но ваш код AppScript, похоже, преобразует индексы в буквы. Который из них?

2. Извините за путаницу, мне понадобятся обе функции (преобразование букв столбцов в индекс столбца nu и наоборот).

Ответ №1:

Сначала нам нужно договориться о значении букв. Я считаю, что традиционный подход заключается в том, что «A» равно 1, «Z» равно 26, «AA» равно 27, «AZ» равно 52, «BA» равно 53 и т. Д.

Тогда я бы, вероятно, выбрал что-то вроде этих функций для преобразования:

 int lettersToIndex(String letters) {
  var result = 0;
  for (var i = 0; i < letters.length; i  ) {
    result = result * 26   (letters.codeUnitAt(i) amp; 0x1f);
  }
  return resu<
}


String indexToLetters(int index) {
  if (index <= 0) throw RangeError.range(index, 1, null, "index");
  const _letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  if (index < 27) return _letters[index - 1];
  var letters = <String>[];
  do {
    index -= 1;
    letters.add(_letters[index.remainder(26)]);
    index ~/= 26;
  } while (index > 0);
  return letters.reversed.join("");  
}
 

Первая функция не проверяет, что входные данные содержат только буквы, но она корректно работает для строк, содержащих только буквы (и в качестве бонуса игнорирует регистр).
Последний проверяет, что индекс больше нуля.

Комментарии:

1. Спасибо, что привели пример для преобразования обоих. Как раз то, что мне было нужно.

2. Я принял ваш ответ. Извините, я новичок и только недавно обнаружил, как принимать ответы.