Summenzahlen in der Region


8

Wie kann ich eine Reihe von Zahlen summieren, die mit Text in der Region durchsetzt sind (keine rechteckige Region)? Wenn die Region beispielsweise diesen Text enthält:

Widgets 234
Sprockets 44
Nubbins 12
Fork handles 4
4 Candles

Ich suche nach einem Befehl, der 298 irgendwie meldet (298 = 234 + 44 + 12 + 4 + 4) - ich denke, entweder indem ich ihn in den Nachrichtenbereich wiedergebe oder ihn in den Puffer einfüge.

Idealerweise würde es sowohl Ganzzahlen als auch Gleitkommazahlen verarbeiten.


1
Beispiele fehlen eindeutig "Ronnies 2" :)
— Phils

Antworten:


6

Hier ist eine:

(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)))

Da es verwendet wird string-to-number, wird das Token "1hello" als Nummer "1" behandelt, "hello2" jedoch nicht als Nummer. Es funktioniert auch mit Dezimalstellen (z. B. 2.4).


5

Speziell für Ihren Fall, vorausgesetzt, dies ist der gesamte Text des Puffers:

  1. M-xreplace-regexpRET[^0-9]+RET+RET
  2. C-x h - Wählen Sie Alle.
  3. C-x * e (Stellen Sie sicher, dass kein nachfolgendes Pluszeichen vorhanden ist) .

Das ersetzt mich durch ein abschließendes + am Ende der Zeile, was dem Calc-Modus nicht gefallen hat: Es hat funktioniert, als ich das entfernt habe. Interessante Antwort, wenn auch etwas unpraktisch für diesen einfachen Anwendungsfall.
— Croad Langshan

3
Eine andere calcLösung: Region markieren, C-x * ggreifen, V u( calc-unpack) und dann tippen, +bis Sie alle Zahlen summiert haben.
— Kindermädchen

2

Ich kenne keinen eingebauten Befehl, der dies tut, aber Sie könnten Ihren eigenen erstellen:

(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)))

Die Antwort von @ zck ist besser (solange Sie damit einverstanden sind, dass die Zahl Teil des Wortes ist). Der reguläre Ausdruck in dieser Antwort müsste erweitert werden, um negative Zahlen zu unterstützen.
— Kyle Meyer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.