Как мне выровнять десятичные числа в Google Sheets


13

В Google Sheets я хочу выравнивать десятичные числа без добавления конечных нулей в дробной части.

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 Sheets.

Временное решение

Можно принудительно использовать конечные символы с помощью команды «Заменить»:

= 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
  • (предположительно) терпит неудачу в локалях, которые используют период как разделитель периода (разделитель тысяч) вместо десятичного маркера

Ответы:


5

С помощью следующего пользовательского формата чисел вы можете выравнивать числа в десятичных числах в Google Sheets, даже используя шрифты, использующие кернинг.

Пользовательский формат

???.?????

Скриншот

пользовательский формат чисел
введите описание изображения здесь

результат
введите описание изображения здесь

пример

Я добавил это решение в файл примера: десятичные числа с выравниванием


1
Поддержка "?" Формат символа отсутствовал, когда я изначально задавал вопрос. Интересно, было ли это добавлено как часть недавней поддержки Google форматов учетных номеров . Это полезный обходной путь, очень близкий к тому, что я хочу. Единственным ограничением является то, что десятичная точка появляется, даже если нет дробной части. В Excel это ограничение можно обойти с помощью условного форматирования. Но, кажется, не в ведомостях. Я принимаю этот ответ.
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, ''));
}

Пример файла

Выравнивание десятичных чисел введите описание изображения здесь


мысли

Этот ответ не снимает проблемы, которые вы упомянули в своем вопросе, но он даст некоторую автоматизацию (динамически) при их отображении !! Удачи.


Я хотел бы отметить, что это может привести к странным проблемам с выравниванием, если вы не используете шрифт фиксированной ширины.
Мир,

@mir спасибо за ваш комментарий Мир. Вам понравился ответ, который я дал? В своих мыслях я объяснил, что это не сняло бы обеспокоенность, высказанную ОП.
Джейкоб Ян Туинстра

1
Ответ был действительно очень полезным, когда я понял, что мне нужно использовать шрифт фиксированной ширины. Я буду честен - я не внимательно прочитал вопрос ... Я просто взглянул на него, чтобы подтвердить, что он похож на мою проблему, а затем сразу же перешел к вашему ответу. Так что я не заметил, что в OP были проблемы со шрифтами.
Мир,

1

Вы можете установить формат условно с помощью скрипта приложений, чтобы выполнить итерацию по диапазону ячеек и применить различные пользовательские форматы номеров, основанные на значении ячейки (целое или нецелое). Используя пользовательские числовые форматы, вы можете отображать пробелы различной ширины с помощью символа подчеркивания, например, _.вставлять пробел шириной точки и _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");
      }
    }
  }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.