EDYCJA (10 lutego 2014 r.): Dodano nową funkcję (tj. lawlist-calculator-update-display
), Która modyfikuje funkcję calculator-update-display
. Za każdym razem, gdy wyświetlacz aktualizuje się podczas serii obliczeń (np. Każda suma cząstkowa, przed osiągnięciem sumy), wyświetlacz odzwierciedla teraz końcową sumę - tj. Z separatorami przecinków, usuwając niepożądane dodatkowe zera i zaokrąglając do czwartego miejsca po przecinku . Dodano (message "Copied
% s to the kill-ring." s)
do lawlist-calculator-copy
.
Poniższy zmodyfikowany kod początkowo zaokrągla na ekranie 4 cyfry po prawej stronie przecinka; z separatorami przecinków co 3 cyfry po lewej stronie przecinka; i usuwa wszelkie niepożądane dodatkowe zera po prawej stronie przecinka dziesiętnego.
Użycie funkcji lawlist-calculator-copy
spowoduje skopiowanie do pierścienia „zabicia” wyniku - w zaokrągleniu do 2 cyfr po prawej stronie przecinka dziesiętnego i będzie zawierać separatory przecinków co 3 cyfry po lewej stronie przecinka dziesiętnego.
Oto link do artykułu na temat zaokrąglania: http://www.mathsisfun.com/rounding-numbers.html
Konwersja liczb, którą preferuję, zaokrągla w górę o 5 - np. 1,555 zaokrągli w górę do 1,56 - funkcja number-conversion
napisana przez @ abo-abo osiąga ten cel. Natomiast (format "%0.2f" 1.555)
zaokrągliby w dół do 1,55 i prawdopodobnie nie powinien być stosowany w przypadku pieniędzy w USA ( moim zdaniem ).
(require 'calculator)
(setq calculator-prompt "Calculator: %s")
(setq calculator-number-digits 4)
(defalias 'calculator-get-prompt 'lawlist-calculator-get-prompt)
(defun lawlist-calculator-get-prompt ()
"Return a string to display.
The string is set not to exceed the screen width."
(let* ((calculator-prompt
(format calculator-prompt
(cond
((or calculator-output-radix calculator-input-radix)
(if (eq calculator-output-radix
calculator-input-radix)
(concat
(char-to-string
(car (rassq calculator-output-radix
calculator-char-radix)))
"=")
(concat
(if calculator-input-radix
(char-to-string
(car (rassq calculator-input-radix
calculator-char-radix)))
"=")
(char-to-string
(car (rassq calculator-output-radix
calculator-char-radix))))))
(calculator-deg "D=")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REMOVE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (t "=="))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REPLACE WITH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(t ""))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(prompt
(concat calculator-prompt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REMOVE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (cdr calculator-stack-display)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REPLACE WITH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(if (floatp (car calculator-stack))
(group-number
(calculator-remove-zeros
;; round to 4 decimal points
;; The function number conversion will be used when copying.
(format "%.4f" (car calculator-stack))))
(cdr calculator-stack-display))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(cond (calculator-curnum
;; number being typed
(concat calculator-curnum "_"))
((and (= 1 (length calculator-stack))
calculator-display-fragile)
;; only the result is shown, next number will
;; restart
nil)
(t
;; waiting for a number or an operator
"?"))))
(trim (- (length prompt) (1- (window-width)))))
(if (<= trim 0)
prompt
(concat calculator-prompt
(substring prompt (+ trim (length calculator-prompt)))))))
(defalias 'calculator-update-display 'lawlist-calculator-update-display)
(defun lawlist-calculator-update-display (&optional force)
"Update the display.
If optional argument FORCE is non-nil, don't use the cached string."
(set-buffer calculator-buffer)
;; update calculator-stack-display
(if (or force
(not (eq (car calculator-stack-display) calculator-stack)))
(setq calculator-stack-display
(cons calculator-stack
(if calculator-stack
(concat
(let ((calculator-displayer
(if (and calculator-displayers
(= 1 (length calculator-stack)))
;; customizable display for a single value
(caar calculator-displayers)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REMOVE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; calculator-displayer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REPLACE WITH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(calculator-remove-zeros
(group-number
(format "%.4f"
(string-to-number
(calculator-number-to-string calculator-stack)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
)))
(mapconcat 'calculator-number-to-string
(reverse calculator-stack)
" " ))
" "
(and calculator-display-fragile
calculator-saved-list
(= (car calculator-stack)
(nth calculator-saved-ptr
calculator-saved-list))
(if (= 0 calculator-saved-ptr)
(format "[%s]" (length calculator-saved-list))
(format "[%s/%s]"
(- (length calculator-saved-list)
calculator-saved-ptr)
(length calculator-saved-list)))))
""))))
(let ((inhibit-read-only t))
(erase-buffer)
(insert (calculator-get-prompt)))
(set-buffer-modified-p nil)
(if calculator-display-fragile
(goto-char (1+ (length calculator-prompt)))
(goto-char (1- (point)))))
(defun lawlist-calculator-copy ()
"Copy current number to the `kill-ring'."
(interactive)
(let ((calculator-displayer
(or calculator-copy-displayer calculator-displayer))
(calculator-displayers
(if calculator-copy-displayer nil calculator-displayers)))
(calculator-enter)
;; remove trailing spaces and an index
(let (
(s
(if (floatp (car calculator-stack))
(group-number
(number-conversion
(format "%s" (car calculator-stack))))
(cdr calculator-stack-display))) )
(and s
(if (string-match "^\\([^ ]+\\) *\\(\\[[0-9/]+\\]\\)? *$" s)
(setq s (match-string 1 s)))
(kill-new s)
(message "Copied `%s` to the kill-ring." s)))))
;; http://stackoverflow.com/a/20101269/2112489
;; @abo-abo
(defun number-conversion (str)
(let ((x (read str)))
(format "%0.2f" (* 0.01 (round (* 100 x)))) ))
;; http://www.emacswiki.org/emacs/ElispCookbook#toc23
(defun group-number (num &optional size char)
"Format NUM as string grouped to SIZE with CHAR."
;; Based on code for `math-group-float' in calc-ext.el
(let* ((size (or size 3))
(char (or char ","))
(str (if (stringp num)
num
(number-to-string num)))
(pt (or (string-match "[^0-9a-zA-Z]" str) (length str))))
(while (> pt size)
(setq str (concat (substring str 0 (- pt size))
char
(substring str (- pt size)))
pt (- pt size)))
str))