#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. Я принял ваш ответ. Извините, я новичок и только недавно обнаружил, как принимать ответы.