地域の合計数


8

(長方形の領域ではなく)領域内のテキストが点在する一連の数値を合計するにはどうすればよいですか?たとえば、リージョンに次のテキストが含まれている場合:

Widgets 234
Sprockets 44
Nubbins 12
Fork handles 4
4 Candles

どういうわけか298を報告するコマンドを探しています(298 = 234 + 44 + 12 + 4 + 4)-メッセージエリアにエコーするか、バッファーに挿入することで推測します。

理想的には、整数と浮動小数点数の両方に対応します。


1
例には明らかに「ロニー2」が欠けています:)
phils '27

回答:


6

ここに一つあります:

(require 'cl-lib)
(defun sum-numbers-in-region (start end)
  (interactive "r")
  (message "%s"
           (cl-reduce #'+
                      (split-string (buffer-substring start
                                                      end))
                      :key #'string-to-number)))

を使用しているためstring-to-number、トークン「1hello」を数値「1」として扱いますが、「hello2」を数値として扱いません。また、小数(2.4など)でも機能します。


5

具体的には、これがバッファーのテキスト全体であると想定します。

  1. M-xreplace-regexpRET[^0-9]+RET+RET
  2. C-x h - すべて選択。
  3. C-x * e (末尾にプラス記号がないことを確認してください)

calc-modeが気に入らなかった行末の末尾の+で私を置き換えます。それを削除したときに機能しました。この単純なユースケースでは少し不便ですが、興味深い回答です。
Croad Langshan 2015

3
もう一つのcalc解決策:マーク領域、C-x * gグラブには、V ucalc-unpack)、をタップし+、あなたがすべての数値を合計するまで。
ナニー

2

これを行う組み込みのコマンドは知りませんが、自分で作成することもできます。

(defun sum-region-nums (beg end)
  (interactive "r")
  (save-excursion
    (goto-char beg)
    (let (nums total)
      (while (re-search-forward "\\b[0-9]+\\(\\.[0-9]+\\)*\\b" end t)
        (push (string-to-number (match-string-no-properties 0))
              nums))
      (setq total (apply #'+ nums))
      (message "%s" total)
      total)))

@zckの答えはより良いです(数字が単語の一部であっても問題がなければ)。この回答の正規表現は、負の数をサポートするように拡張する必要があります。
Kyle Meyer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.