Як визначити вирівнювання цифр у таблицях 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
  • (імовірно) виходить з ладу в локальних місцях, які використовують період як роздільник періоду (тисячний роздільник) замість десяткового маркера

Відповіді:


5

За допомогою наступного спеціального формату чисел ви можете вирівняти цифри в таблицях Google, навіть використовуючи шрифти, які використовують кернінг.

Спеціальний формат

???.?????

Знімок екрана

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

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

Приклад

Я додав це рішення у прикладний файл: Десятично-вирівняні числа


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
Відповідь насправді була дуже корисною, коли я зрозумів, що мені потрібно використовувати шрифт фіксованої ширини. Буду чесно - я питання не прочитав уважно ... Я просто поглянув на це, щоб підтвердити, що воно схоже на моє питання, а потім перейшов прямо до вашої відповіді. Тож я не помітив, що ОП включала стурбованість щодо шрифтів.
Мир

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.