如何在Google表格中对数字进行十进制对齐


13

在Google表格中,我想对数字进行十进制对齐,而不要在小数部分中添加尾随零。

Instead of:  I want:
+------+     +------+
|  56.0|     |  56  |
|  27.0|     |  27  |
|  83.0|     |  83  |
|   2.4|     |   2.4|
|   1.2|     |   1.2|
| 120.0|     | 120  |
+------+     +------+

第一列的格式很容易实现(例如,使用格式“ 0.0”或仅在123按钮下设置自定义小数点)。

在Excel中,我认为第二列的格式是使用“ 0.?”格式完成的,但是截至本文撰写之时,它在Google表格中仍然无法使用。

解决方法

可以用“替换”强制结尾字符:

= Substitute( Text( formula ; "0.0" ) ; ".0" ; "  ")
= Substitute( Text( formula ; "0.0" ) ; ".0" ; "__" )

注意:两个替换的空格字符不是U + 0020 SPACE,而是U + 2002 EN SPACE。(U + 00A0 NO-BREAK SPACE也可以。)

此替代方法的一些不良副作用是它

  • 不仅修改显示格式,还修改单元格的值
  • 需要在单元格中使用等宽字体
  • 尾随空白会由于Unicode而导致字体替换,并且无法正确打印
  • 尾部下划线不如尾部空白好
  • 使维护者感到困惑,因为尚不清楚正在使用EN SPACE
  • (大概)在使用句点作为句点分隔符(千位分隔符)而不是小数点标记的语言环境中失败

Answers:


5

使用以下自定义数字格式,即使使用使用字距调整的字体,您也可以将Google表格中的数字十进制对齐。

自订格式

???.?????

屏幕截图

自定义数字格式
在此处输入图片说明

结果
在此处输入图片说明

我已在示例文件中添加了此解决方案:小数对齐数字


1
支持“?” 当我最初问这个问题时,格式字符不存在。我想知道它是否被添加为Google最近对会计编号格式的支持的一部分。这是一个有用的解决方法,非常接近我想要的。唯一的限制是即使没有小数部分,小数点也会出现。在Excel中,可以使用条件格式解决该限制。但是,似乎不是在Sheets中。我接受这个答案。
MetaEd

4

我编写了一些代码,使您的生活更加轻松,显示了十进制对齐的数字。

第一个代码

只能在范围内使用,因为它会根据范围内的最高小数位动态更改数字的外观。它还允许您选择结尾字符,例如CHAR(160):

function RANGETRAIL(range,chr){
  chr = chr || '0'; 
  var aValues = new Array(), aDecimals = new Array();

  var max=0;
  for(i in range) {
    if(range[i] != "") {
      var string = range[i].toString();
      aValues.push([string]);
      var aSplit = string.split("."); 

      if(aSplit.length > 1) {
        aDecimals.push([aSplit[1].length]);
        if(aSplit[1].length > max) {
          max = parseInt(aSplit[1].length);        
        } 
      } else {
        aDecimals.push(["-1"]);
      }
    }
  } 

  for(k in aDecimals) {
    if(parseInt(aDecimals[k]) != parseInt(max)) {
      for(var l=parseInt(aDecimals[k]); l<parseInt(max); l++) {        
        aValues[k][0] += chr;
      }
    }
  }     
  return aValues;
}

第二码

是指用于细胞。在这里,您需要设置尾随长度:

function CELLTRAIL(cell,len,chr){
  // Brad Christie, http://stackoverflow.com/a/5024108/1536038
  chr = chr || '0'; 
  cell = cell.toString();

  if (!len) return cell;

  var p = cell.indexOf('.');
  p = (p!==-1?(cell.length-p-1):-1);

  for (var m = p; m < len; m++) {
    cell += chr;
  }
  return cell;
}

第三码

将从所有非数字字符串中捆绑,“。”除外。和“,”:

function RTRIM(cell) {   
  return Number(cell.replace(/[^0-9$.,]/g, ''));
}

示例文件

小数对齐数字 在此处输入图片说明


思想

这个答案并不能消除您在问题中提到的问题,但是可以自动(动态地)显示它们!祝好运。


我想指出的是,如果您不使用固定宽度的字体,可能会导致奇怪的对齐问题。
2014年

@mir感谢您的评论Mir。你喜欢我给的答案吗?我在思想标题中解释说,这不会消除OP所带来的担忧。
Jacob Jan Tuinstra 2014年

1
一旦我意识到我需要使用固定宽度的字体,答案实际上就会很有帮助。老实说-我没有仔细阅读问题...我只是看了一眼就确认它与我的问题相似,然后直接跳到您的答案。因此,我没有注意到OP包含有关字体的问题。
2014年

1

您可以使用Apps脚本有条件地设置格式,以在单元格范围内进行迭代,并根据单元格的值(整数与非整数)应用不同的“ 自定义编号格式”。使用“自定义数字格式”,您可以使用下划线字符显示不同宽度的空白,例如,将空白插入_.为句点宽度,_0并将空白插入为零字符宽度。顺便说一句,大多数字体对所有数字字符使用相同的宽度,因此0字符与1、2和3等的宽度相同。

这是如何在通过运行脚本应用格式之前和之后显示数字的示例。一个缺点是,单元格的值从整数更改为非整数,反之亦然,这将需要重新应用格式以根据需要显示或隐藏小数。

  Raw Numbers  Decimal Aligned
+------------+----------------+
|    1234.777|         1,234.8|
|        5454|         5,454  |
|           7|             7  |
|         0.5|             0.5|
+------------+----------------+

脚本

function decimalAlign() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet1");
  var range = sheet.getRange("B2:B5");
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      var currentCell = range.getCell(i,j);
      var currentValue = currentCell.getValue();
      if (Math.round(currentValue) == currentValue) {
        currentCell.setNumberFormat("#,##0_._0");
      } else {
        currentCell.setNumberFormat("#,##0.0");
      }
    }
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.