【问题标题】:Dart: how to convert a column letter into numberDart:如何将列字母转换为数字
【发布时间】:2021-07-28 18:55:33
【问题描述】:

目前使用 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 

您对如何改进此代码有任何建议吗?

【问题讨论】:

  • 您的文本要求将字母转换为索引,但您的 AppScript 代码似乎将索引转换为字母。是哪一个?
  • 对不起,我需要这两个函数(将列字母转换为列索引 nu,反之亦然)。

标签: dart


【解决方案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) & 0x1f);
  }
  return result;
}


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("");  
}

前一个函数不会验证输入是否只包含字母,但它对于只包含字母的字符串可以正常工作(并且它会忽略大小写作为奖励)。 后者确实检查索引是否大于零。

【讨论】:

  • 感谢您提供转换两者的示例。正是我需要的。
  • 我接受了你的回答。抱歉,我是新手,最近才发现如何接受答案。
【解决方案2】:

基于 Irn 回答的简化版本

int lettersToIndex(String letters) => 
    letters.codeUnits.fold(0, (v, e) => v * 26 + (e & 0x1f));

String indexToLetters(int index) {
  var letters = '';
  do {
    final r = index % 26;
    letters = '${String.fromCharCode(64 + r)}$letters';
    index = (index - r) ~/ 26;
  } while (index > 0);
  return letters;
}

【讨论】:

  • 感谢简化版。
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多