Jak wyrównywać liczby dziesiętne w Arkuszach Google

13

W Arkuszach Google chcę wyrównywać liczby dziesiętne bez dodawania zer końcowych w części ułamkowej.

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

Format pierwszej kolumny można łatwo osiągnąć (na przykład przy użyciu formatu „0.0” lub po prostu ustawiając niestandardowe kropki dziesiętne pod przyciskiem 123).

W Excelu uważam, że format drugiej kolumny jest realizowany przy użyciu formatu „0?”, Ale od tego momentu nie działa w Arkuszach Google.

Obejście

Można wymusić końcowe znaki za pomocą Zastępowania:

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

Uwaga: dwoma podstawionymi znakami spacji nie są U + 0020 SPACE, ale U + 2002 EN SPACE . ( U + 00A0 PRZESTRZEŃ BEZ PRZERWY również działa.)

Niektóre niepożądane skutki tego obejścia są takie

  • modyfikuje nie tylko format wyświetlania, ale także wartość komórki
  • wymaga użycia czcionki o stałej szerokości w komórce
  • końcowe białe znaki powodują zamianę czcionek ze względu na Unicode i nie są drukowane poprawnie
  • końcowe podkreślenia nie są tak pożądane jak końcowe białe znaki
  • myli opiekunów, ponieważ nie jest oczywiste, że używana jest EN SPACE
  • (przypuszczalnie) zawodzi w lokalizacjach, w których kropka jest używana jako separator kropki (separator tysięcy) zamiast znacznika dziesiętnego
MetaEd
źródło

Odpowiedzi:

5

Korzystając z następującego niestandardowego formatu liczb, możesz wyrównywać liczby dziesiętne w Arkuszach Google, nawet przy użyciu czcionek korzystających z kerningu.

Format niestandardowy

???.?????

Zrzut ekranu

niestandardowy format liczb
wprowadź opis zdjęcia tutaj

wynik
wprowadź opis zdjęcia tutaj

Przykład

Dodałem to rozwiązanie do przykładowego pliku: Liczby wyrównane dziesiętnie

Jacob Jan Tuinstra
źródło
1
Wsparcie dla „?” znak formatu był nieobecny, kiedy pierwotnie zadałem pytanie. Zastanawiam się, czy został dodany w ramach niedawnej obsługi formatów liczb księgowych przez Google . Jest to przydatne obejście, bardzo zbliżone do tego, czego chcę. Jedynym ograniczeniem jest to, że kropka dziesiętna pojawia się nawet wtedy, gdy nie ma części ułamkowej. W programie Excel to ograniczenie można obejść za pomocą formatowania warunkowego. Ale wydaje się, że nie w Arkuszach. Przyjmuję tę odpowiedź.
MetaEd
4

Napisałem trochę kodu, aby ułatwić ci życie, wyświetlając cyfry po przecinku.

Pierwszy kod

można używać tylko w zakresie, ponieważ dynamicznie zmienia wygląd liczb zgodnie z najwyższym miejscem po przecinku w zakresie. Pozwala również wybrać końcową postać, na przykład 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;
}

Drugi kod

ma być stosowany do komórek. Tutaj musisz ustawić końcową długość:

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;
}

Trzeci kod

zapisze ciąg ze wszystkich znaków nienumerycznych, z wyjątkiem „.” i ",":

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

Przykładowy plik

Liczby wyrównane dziesiętnie wprowadź opis zdjęcia tutaj


Myśli

Ta odpowiedź nie usuwa obaw, o których wspomniałeś w swoim pytaniu, ale da ci pewną automatyzację (dynamicznie) w ich wyświetlaniu !! Powodzenia.

Jacob Jan Tuinstra
źródło
Chciałbym zaznaczyć, że może to prowadzić do dziwnych problemów z wyrównaniem, jeśli nie używasz czcionki o stałej szerokości.
Mir
@mir dzięki za komentarz Mir. Podobała Ci się odpowiedź, której udzieliłem? W nagłówku myśli wyjaśniłem, że nie usunie to obaw OP.
Jacob Jan Tuinstra
1
Odpowiedź była naprawdę bardzo pomocna, gdy zdałem sobie sprawę, że muszę użyć czcionki o stałej szerokości. Będę szczery - nie przeczytałem pytania dokładnie ... Spojrzałem na nie, aby potwierdzić, że jest ono podobne do mojego problemu, a potem od razu podskoczyłem do odpowiedzi. Nie zauważyłem więc, że OP zawiera obawy dotyczące czcionek.
Mir
1

Możesz ustawić format warunkowo, używając skryptu aplikacji do iteracji w zakresie komórek i stosowania różnych niestandardowych formatów liczb w zależności od wartości komórki (liczba całkowita vs liczba całkowita). Za pomocą niestandardowych formatów liczb można wyświetlać białe spacje o różnej szerokości za pomocą znaku podkreślenia, na przykład _.wstawia białe spacje o szerokości kropki i _0wstawia białe znaki o szerokości zero. Nawiasem mówiąc, większość czcionek używa tej samej szerokości dla wszystkich znaków numerycznych, więc znak 0 ma taką samą szerokość jak 1, 2 i 3 itd.

Jest to przykład sposobu wyświetlania liczb przed i po zastosowaniu formatowania przez uruchomienie skryptu. Jedną wadą jest to, że zmiana wartości komórki z liczby całkowitej na liczbę całkowitą lub odwrotnie wymagać będzie ponownego zastosowania formatowania w celu wyświetlenia lub ukrycia liczby dziesiętnej w razie potrzeby.

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

Scenariusz

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");
      }
    }
  }
}
Collin Anderson
źródło