]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve how dired-mark-sexp interprets file sizes in non-C locales
authorLars Ingebrigtsen <larsi@gnus.org>
Fri, 3 Dec 2021 16:01:30 +0000 (17:01 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 3 Dec 2021 16:22:59 +0000 (17:22 +0100)
* lisp/dired-x.el (dired-x--string-to-number): Try to understand
localised numbers (with "." separators or the like) (bug#23373).

lisp/dired-x.el
test/lisp/dired-x-tests.el

index 855e58e16c121b76afb70b79b2a40b2650342446..38d8a954a83811be4090486702ca2f255ad27a92 100644 (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.
index fe4b9711d49e300c59cb8351c99eaee06636a7ac..c6ac7c602ea27c00529da7a2cffb6a8d71cc6dce 100644 (file)
     (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