¿Cómo alineo los números decimales en las Hojas de cálculo de Google?

13

En Google Sheets, quiero alinear números decimales sin agregar ceros finales en la parte fraccionaria.

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

El formato de la primera columna se logra fácilmente (por ejemplo, usando el formato "0.0" o simplemente configurando puntos decimales personalizados bajo el botón 123).

En Excel, creo que el formato de la segunda columna se logra usando el formato "0.?", Pero al momento de escribir esto no funciona en Google Sheets.

Solución alterna

Es posible forzar caracteres finales con Sustituir:

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

Nota: los dos caracteres de espacio en blanco sustituidos no son U + 0020 SPACE sino U + 2002 EN SPACE . ( U + 00A0 NO-BREAK SPACE también funciona).

Algunos efectos secundarios indeseables de esta solución alternativa son que

  • modifica no solo el formato de visualización sino también el valor de la celda
  • requiere el uso de una fuente monoespaciada en la celda
  • el espacio en blanco al final provoca la sustitución de fuentes debido a Unicode y no se imprime correctamente
  • los subrayados finales no son tan deseables como los espacios en blanco finales
  • confunde a los mantenedores porque no es evidente que se esté utilizando un EN SPACE
  • (presumiblemente) falla en configuraciones regionales que usan el punto como separador de períodos (separador de miles) en lugar del marcador decimal
MetaEd
fuente

Respuestas:

5

Con el siguiente formato de número personalizado, puede alinear números decimales en las Hojas de cálculo de Google, incluso utilizando fuentes que utilicen interletraje.

Formato personalizado

???.?????

Captura de pantalla

formato de número personalizado
ingrese la descripción de la imagen aquí

resultado
ingrese la descripción de la imagen aquí

Ejemplo

He agregado esta solución en un archivo de ejemplo: Números alineados decimales

Jacob Jan Tuinstra
fuente
1
Soporte para el "?" el carácter de formato estaba ausente cuando originalmente hice la pregunta. Me pregunto si se agregó como parte del soporte reciente de Google para los formatos de números de contabilidad . Esta es una solución útil, muy cercana a lo que quiero. La única limitación es que aparece un punto decimal incluso cuando no hay una parte fraccional. En Excel, esa limitación se puede solucionar con el formato condicional. Pero no, al parecer, en Sheets. Estoy aceptando esta respuesta.
MetaEd
4

Escribí un código para que tu vida sea un poco más fácil, al mostrar números alineados con decimales.

El primer código

solo se puede usar en un rango, porque cambia dinámicamente la apariencia de los números de acuerdo con el lugar decimal más alto en el rango. También le permite elegir el carácter final, como 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;
}

El segundo código

está destinado a ser utilizado para las células. Aquí debe establecer la longitud final:

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

El tercer código

atará una cadena de todos los no numéricos, excepto un "." y ",":

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

Archivo de ejemplo

Números Alineados Decimales ingrese la descripción de la imagen aquí


Pensamientos

¡Esta respuesta no quita las preocupaciones que mencionó en su pregunta, pero le dará cierta automatización (dinámicamente) al mostrarlas! Buena suerte.

Jacob Jan Tuinstra
fuente
Me gustaría señalar que esto puede conducir a problemas de alineación extraños si no está utilizando una fuente de ancho fijo.
Mir
@mir gracias por tu comentario Mir. ¿Te gustó la respuesta que di? En el encabezado de los pensamientos , expliqué que no eliminaría las preocupaciones que dio el OP.
Jacob Jan Tuinstra
1
La respuesta fue realmente útil una vez que me di cuenta de que necesitaba usar una fuente de ancho fijo. Seré honesto: no leí la pregunta con atención ... Solo la miré para confirmar que era similar a mi problema, luego salté directamente a su respuesta. Así que no noté que OP incluía preocupaciones sobre las fuentes.
Mir
1

Puede establecer el formato condicionalmente mediante el uso de un script de aplicaciones para iterar sobre el rango de celdas y aplicar diferentes formatos de números personalizados en función del valor de la celda (entero frente a no entero). Con los formatos de números personalizados, puede mostrar espacios en blanco de ancho variable utilizando el carácter de subrayado, por ejemplo, _.inserta un espacio en blanco del ancho de un punto e _0inserta espacios en blanco del ancho de un carácter cero. Por cierto, la mayoría de las fuentes usan el mismo ancho para todos los caracteres numéricos, por lo que un carácter 0 tiene el mismo ancho que un 1 y 2 y 3, etc.

Este es un ejemplo de cómo se muestran los números antes y después de aplicar el formatd ejecutando el script. Un inconveniente es que un cambio en el valor de la celda de entero a no entero o viceversa requerirá que el formato se vuelva a aplicar para mostrar u ocultar el decimal según sea necesario.

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

Guión

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
fuente