Googleスプレッドシートで数値を10進数で整列するにはどうすればよいですか


13

Googleスプレッドシートでは、小数部分に末尾のゼロを追加せずに数値を10進数に揃えたいと思います。

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では、2番目の列の形式は「0.?」の形式を使用して実現されますが、この記事の執筆時点では、Googleスプレッドシートでは機能していません。

回避策

Substituteを使用して、末尾の文字を強制することができます。

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

注:2つの置換された空白文字はU + 0020 SPACEではなく、U + 2002 EN SPACEです。(U + 00A0 NO-BREAK SPACEも機能します。)

この回避策のいくつかの望ましくない副作用は、

  • 表示形式だけでなく、セルの値も変更します
  • セルで等幅フォントを使用する必要があります
  • 末尾の空白はUnicodeによるフォント置換を引き起こし、正しく印刷されません
  • 末尾の下線は末尾の空白ほど望ましくありません
  • EN SPACEが使用されていることが明らかでないため、メンテナーを混乱させる
  • (おそらく)小数点記号の代わりにピリオドをピリオド区切り記号(千の区切り記号)として使用するロケールで失敗します

回答:


5

次のカスタム数値形式を使用すると、カーニングを使用するフォントを使用する場合でも、Googleスプレッドシートで数値を10進数に揃えることができます。

カスタムフォーマット

???.?????

スクリーンショット

カスタム数値形式
ここに画像の説明を入力してください

結果
ここに画像の説明を入力してください

このソリューションをサンプルファイルに追加しました:Decimal-Aligned Numbers


1
「?」のサポート 最初に質問したとき、フォーマット文字はありませんでした。Googleの最近の会計番号形式のサポートの一部として追加されたのだろうか。これは便利な回避策であり、私が望むものに非常に近いものです。唯一の制限は、小数部がない場合でも小数点が表示されることです。Excelでは、その制限は条件付き書式で回避できます。ただし、スプレッドシートではそうではありません。私はこの答えを受け入れています。
メタエド

4

10進数の数値を表示する際に、ライブを少し簡単にするためのコードをいくつか書きました。

最初のコード

範囲内でのみ使用できます。これは、範囲内で最も高い小数点以下の桁数に従って数字の外観を動的に変更するためです。また、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;
}

2番目のコード

セルに使用するためのものです。ここで、末尾の長さを設定する必要があります。

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

3番目のコード

「。」以外のすべての非数値から文字列をストラップします および「、」:

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

サンプルファイル

10進数の数字 ここに画像の説明を入力してください


考え

この回答は、あなたがあなたの質問で言及した懸念を取り除くものではありませんが、それらを表示する際に(動的に)ある程度の自動化を提供します!! 幸運を。


固定幅フォントを使用していない場合、これにより奇妙な位置合わせの問題が発生する可能性があることを指摘したいと思います。
ミール14

@mirありがとう、ミール。私の答えが好きでしたか?で見出し思考私はそれはOPが与えた懸念を奪うないだろうと説明しました。
ジェイコブヤントゥインストラ14

1
固定幅フォントを使用する必要があることに気付いたとき、答えは実際に本当に役に立ちました。私は正直に言う-私は質問を注意深く読んでいなかった...私はそれが私の問題に似ていることを確認するためにそれをちらっと見て、そしてあなたの答えにまっすぐに飛びついた。そのため、OPにはフォントに関する懸念が含まれていることに気付きませんでした。
ミール14

1

Appsスクリプトを使用してセルの範囲を反復処理し、セルの値(整数と非整数)に基づいて異なるカスタム数値書式を適用することで、条件付きで書式を設定できます。カスタム数値形式を使用すると、アンダースコア文字を使用してさまざまな幅の空白を表示できます。たとえば、_.空白をピリオドの幅で挿入したり、_0空白をの幅で挿入し、空白をゼロ文字の幅で挿入します。ちなみに、ほとんどのフォントはすべての数字に同じ幅を使用しているため、0文字は1や2、3などと同じ幅です。

これは、スクリプトを実行して書式設定を適用する前後の数値の表示方法の例です。1つの欠点は、セルの値を整数から非整数に、またはその逆に変更すると、必要に応じて小数を表示または非表示にするために書式設定を再適用する必要があることです。

  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");
      }
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.