【问题标题】:How do I pre-sort numbers and not screw up the formatting?如何对数字进行预排序而不搞砸格式?
【发布时间】:2015-10-07 23:28:23
【问题描述】:

我正在编写一个自定义函数,它将返回一个数组数组:

function tester(col){
  var rows = [ // this gives me an error on sorting, so turn numbers to strings
    [4,2,3,"Tom"],
    [0,8,9,"Bill"],
    [5,7,1,"Bob"],
    [1,2,3,"Charlie"]
  ];

  rows = [ // turning numbers to strings screws up formatting
    ["4","2","3","Tom"],
    ["0","8","9","Bill"],
    ["5","7","1","Bob"],
    ["1","2","3","Charlie"]
  ];
   rows.sort(function(a, b) {
   return a[col].localeCompare(b[col]); // sort by column passed by user
  });
  return rows;
}

如前所述,如果我传入数字,我会收到错误:

TypeError: Cannot find function localCompare in object

如果我将这些数字转换为可以排序的字符串,但用户无法格式化数字...显示更多小数、逗号、将它们转换为百分比等。我该如何解决这个问题?

编辑:

我尝试了 Buzinas/Kriggs 的建议,但它似乎对数字和否定词进行了词汇排序,而其他排序则不正确。我现在有(注意负数 4 和 750):

function tester(col){
  var rows = [
    [-4,2,3,"Tom"],
    [0,8,9,"Bill"],
    [5,750,1,"Bob"],
    [1,2,3,"Charlie"]
  ];

  rows.sort(function(a, b) {
     return a[col].toString().localeCompare(b[col].toString());
  });

  return rows;
}

【问题讨论】:

  • 排序后变回数字?
  • 一些讨厌的提示:(0+'') === '0' // true
  • @Roomy 我不关注
  • @kristen 我的意思是向numberNumber 的实例添加一个空字符串('') 将产生一个字符串,所以遵循这个(a[col]+'').localeCompare((b[col]+'')) 应该是你想要的。我没有测试它,这只是如何将任何数字转换为字符串的提示。

标签: javascript google-apps-script google-sheets google-apps


【解决方案1】:

更新

既然你想按数字排序,如果它们是数字,如果它们是字符串,你可以这样做:

function tester(col){
  var rows = [
    [4,2,3,"Tom"],
    [0,8,9,"Bill"],
    [5,7,1,"Bob"],
    [1,2,3,"Charlie"]
  ];

  rows.sort(function(a, b) {
    if (typeof a[col] === 'number')
      return a[col] > b[col];
    return a[col].localeCompare(b[col]);
  });

  return rows;
}

【讨论】:

  • 好的,这真的很奇怪。现在,唯一可以正确排序的列是第 0 列(第一列)。
  • @kristen 他放错了.toString(),这实际上是将整行转换为字符串然后比较它,这就是为什么似乎只有A列在索引,它应该是:a[col].toString().localeCompare(b[col].toString());。如果您对 hack'ish 没有任何问题,可以使用 (a[col]+'').localeCompare((b[col]+'')) 缩短它。
  • 就是这样。非常感谢;)
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2011-12-27
相关资源
最近更新 更多