1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-28 07:45:00 +00:00

Improve how dired-mark-sexp interprets file sizes in non-C locales

* lisp/dired-x.el (dired-x--string-to-number): Try to understand
localised numbers (with "." separators or the like) (bug#23373).
This commit is contained in:
Lars Ingebrigtsen 2021-12-03 17:01:30 +01:00
parent 20124d78e7
commit 52b2ffd83b
2 changed files with 22 additions and 7 deletions

View File

@ -1265,13 +1265,21 @@ sure that a trailing letter in STR is one of BKkMGTPEZY."
(let* ((val (string-to-number str))
(u (unless (zerop val)
(aref str (1- (length str))))))
(when (and u (> u ?9))
(when (= u ?k)
(setq u ?K))
(let ((units '(?B ?K ?M ?G ?T ?P ?E ?Z ?Y)))
(while (and units (/= (pop units) u))
(setq val (* 1024.0 val)))))
val))
;; If we don't have a unit at the end, but we have some
;; non-numeric strings in the string, then the string may be
;; something like "4.134" or "4,134" meant to represent 4134
;; (seen in some locales).
(if (and u
(<= ?0 u ?9)
(string-match-p "[^0-9]" str))
(string-to-number (replace-regexp-in-string "[^0-9]+" "" str))
(when (and u (> u ?9))
(when (= u ?k)
(setq u ?K))
(let ((units '(?B ?K ?M ?G ?T ?P ?E ?Z ?Y)))
(while (and units (/= (pop units) u))
(setq val (* 1024.0 val)))))
val)))
(defun dired-mark-sexp (predicate &optional unflag-p)
"Mark files for which PREDICATE returns non-nil.

View File

@ -60,5 +60,12 @@
(should (equal (dired-guess-default '("/tmp/foo.png" "/tmp/foo.txt"))
nil))))
(ert-deftest dired-x--string-to-number ()
(should (= (dired-x--string-to-number "2.4K") 2457.6))
(should (= (dired-x--string-to-number "2400") 2400))
(should (= (dired-x--string-to-number "123.4M") 129394278.4))
(should (= (dired-x--string-to-number "123.40000M") 129394278.4))
(should (= (dired-x--string-to-number "4.134") 4134)))
(provide 'dired-x-tests)
;;; dired-x-tests.el ends here