Comment aligner des nombres décimaux dans Google Sheets

13

Dans Google Sheets, je souhaite aligner les nombres décimaux sans ajouter de zéros de fin dans la partie fractionnaire.

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

Le format de la première colonne est facile à réaliser (par exemple, en utilisant le format "0,0" ou en définissant simplement des points décimaux personnalisés sous le bouton 123).

Dans Excel, je crois que le format de la deuxième colonne est accompli en utilisant le format "0.?", Mais à ce jour, cela ne fonctionne pas dans Google Sheets.

solution de contournement

Il est possible de forcer les caractères de fin avec Substitute:

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

Remarque: les deux caractères blancs substitués ne sont pas U + 0020 ESPACE mais U + 2002 EN ESPACE . ( U + 00A0 NO-BREAK SPACE fonctionne également.)

Certains effets secondaires indésirables de cette solution de contournement sont qu'il

  • modifie non seulement le format d'affichage mais aussi la valeur de la cellule
  • nécessite l'utilisation d'une police à espacement fixe dans la cellule
  • les espaces de fin entraînent une substitution de polices en raison de l'Unicode et ne s'impriment pas correctement
  • les soulignements de fin ne sont pas aussi souhaitables que les espaces de fin
  • confond les mainteneurs car il n'est pas évident qu'un EN ESPACE est utilisé
  • (vraisemblablement) échoue dans les paramètres régionaux qui utilisent la période comme séparateur de période (séparateur de milliers) au lieu du marqueur décimal
MetaEd
la source

Réponses:

5

Avec le format numérique personnalisé suivant, vous pouvez aligner les nombres de manière décimale dans Google Sheets, même en utilisant des polices utilisant le crénage.

Format personnalisé

???.?????

Capture d'écran

format numérique personnalisé
entrez la description de l'image ici

résultat
entrez la description de l'image ici

Exemple

J'ai ajouté cette solution dans un exemple de fichier: Numéros alignés décimaux

Jacob Jan Tuinstra
la source
1
Prise en charge du "?" le caractère de format était absent quand j'ai à l'origine posé la question. Je me demande s'il a été ajouté dans le cadre de la récente prise en charge par Google des formats de numéro de comptabilité . Il s'agit d'une solution de contournement utile, très proche de ce que je veux. La seule limitation est qu'un point décimal apparaît même lorsqu'il n'y a pas de partie fractionnaire. Dans Excel, cette limitation peut être contournée avec une mise en forme conditionnelle. Mais pas, semble-t-il, dans Sheets. J'accepte cette réponse.
MetaEd
4

J'ai écrit du code pour vous faciliter la vie, en affichant des nombres alignés décimaux.

Le premier code

ne peut être utilisé que dans une plage, car il modifie dynamiquement l'apparence des nombres en fonction de la décimale la plus élevée de la plage. Il vous permet également de choisir le caractère de fin, comme 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;
}

Le deuxième code

est destiné à être utilisé pour les cellules. Ici, vous devez définir la longueur de fin:

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

Le troisième code

liera une chaîne de tous les caractères non numériques, sauf un "." et ",":

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

Exemple de fichier

Nombres alignés sur les décimales entrez la description de l'image ici


Pensées

Cette réponse ne supprime pas les préoccupations que vous avez mentionnées dans votre question, mais elle donnera une certaine automatisation (dynamique) pour les afficher !! Bonne chance.

Jacob Jan Tuinstra
la source
Je voudrais souligner que cela peut entraîner d'étranges problèmes d'alignement si vous n'utilisez pas de police à largeur fixe.
Mir
@mir merci pour ton commentaire Mir. Vous avez aimé la réponse que j'ai donnée? Dans la rubrique pensées, j'ai expliqué que cela ne dissiperait pas les inquiétudes du PO.
Jacob Jan Tuinstra, le
1
La réponse a été vraiment très utile une fois que j'ai réalisé que je devais utiliser une police à largeur fixe. Je vais être honnête - je n'ai pas lu attentivement la question ... Je l'ai simplement regardée pour confirmer qu'elle était similaire à mon problème, puis j'ai directement sauté sur votre réponse. Je n'ai donc pas remarqué que OP incluait des préoccupations concernant les polices.
Mir
1

Vous pouvez définir le format de manière conditionnelle à l'aide d'un script Apps pour itérer sur la plage de cellules et appliquer différents formats de nombre personnalisés en fonction de la valeur de la cellule (entier vs non entier). À l'aide de formats numériques personnalisés, vous pouvez afficher des espaces blancs de largeur variable à l'aide du caractère de soulignement, par exemple, _.insère des espaces blancs de la largeur d'un point et_0 insère des espaces blancs la largeur d'un caractère zéro. Soit dit en passant, la plupart des polices utilisent la même largeur pour tous les caractères numériques, donc un caractère 0 a la même largeur qu'un 1 et 2 et 3, etc.

Ceci est un exemple de la façon dont les nombres sont affichés avant et après l'application du formatd en exécutant le script. Un inconvénient est qu'un changement dans la valeur de la cellule de entier à non entier ou vice-versa nécessitera la mise en forme à réappliquer pour afficher ou masquer la décimale selon les besoins.

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

Scénario

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
la source