Tổng số trong khu vực


8

Làm cách nào tôi có thể tổng hợp một tập hợp các số xen kẽ với văn bản trong vùng (không phải là vùng hình chữ nhật). Ví dụ: nếu vùng chứa văn bản này:

Widgets 234
Sprockets 44
Nubbins 12
Fork handles 4
4 Candles

Tôi đang tìm kiếm một lệnh sẽ báo cáo bằng cách nào đó (298 = 234 + 44 + 12 + 4 + 4) - Tôi đoán bằng cách lặp lại nó vào vùng thông báo hoặc chèn nó vào bộ đệm.

Lý tưởng nhất là nó sẽ đối phó với cả số nguyên và số dấu phẩy động.


1
Ví dụ rõ ràng là thiếu "Ronnies 2" :)
phils

Câu trả lời:


6

Đây là một:

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

Bởi vì nó sử dụng string-to-number, nó sẽ coi mã thông báo "1hello" là số "1", nhưng sẽ không coi "hello2" là số. Nó cũng hoạt động với số thập phân (ví dụ, 2.4).


5

Cụ thể cho trường hợp của bạn, giả sử đây là toàn bộ văn bản của bộ đệm:

  1. M-xreplace-regexpRET[^0-9]+RET+RET
  2. C-x h - chọn tất cả.
  3. C-x * e (đảm bảo không có dấu cộng) .

Thay thế tôi bằng dấu + ở cuối dòng mà chế độ calc không thích: nó hoạt động khi tôi loại bỏ nó. Câu trả lời thú vị mặc dù hơi bất tiện cho trường hợp sử dụng đơn giản này.
Croad Lang Sơn

3
Một calcgiải pháp khác : đánh dấu vùng, C-x * gđể lấy, V u( calc-unpack), sau đó nhấn +cho đến khi bạn tổng hợp tất cả các số.
mẫu

2

Tôi không biết một lệnh tích hợp thực hiện điều này, nhưng bạn có thể tự tạo:

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

Câu trả lời của @ zck đẹp hơn (miễn là bạn ổn với số là một phần của từ). Biểu thức chính quy trong câu trả lời này sẽ cần được mở rộng để hỗ trợ các số âm.
Kyle Meyer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.