[bknr-cvs] r2453 - branches/bos/projects/bos/m2

ksprotte at common-lisp.net ksprotte at common-lisp.net
Fri Feb 8 14:45:58 UTC 2008


Author: ksprotte
Date: Fri Feb  8 09:45:54 2008
New Revision: 2453

Modified:
   branches/bos/projects/bos/m2/geometry.lisp
Log:
added new function: FORMAT-LON-LAT


Modified: branches/bos/projects/bos/m2/geometry.lisp
==============================================================================
--- branches/bos/projects/bos/m2/geometry.lisp	(original)
+++ branches/bos/projects/bos/m2/geometry.lisp	Fri Feb  8 09:45:54 2008
@@ -214,3 +214,56 @@
       (traverse boundary-point initial-direction)
       (nreverse polygon))))
 
+
+;;; formatting
+;; proposed by Michael Weber on alexandria-devel
+(defun format-mixed-radix-number (stream number radix-list format-list
+                                  &key lsb-first leading-zeros
+				  (trailing-zeros t))
+  "Prints NUMBER to STREAM in mixed-radix RADIX.
+representation-LIST is a list of radixes, least-significant first.
+FORMAT-LIST is a list of format directives, one for each digit.
+When LSB-FIRST is nil (default), print most-significant digit first,
+otherwise least-significant digit first.
+When LEADING-ZEROS and TRAILING-ZEROS are nil, leading and
+trailing zero digits are not printed, respectively. \(default: remove
+leading zeros, keep trailing zeros)"
+  (let ((format-pairs
+         (loop with digit and fraction
+	    initially (setf (values number fraction)
+			    (truncate number))
+	    for f-list on format-list
+	    and r-list = radix-list then (rest r-list)
+	    collect (list (first f-list)
+			  (cond ((endp r-list)
+				 (shiftf number 0))
+				((rest f-list)
+				 (setf (values number digit)
+				       (truncate number (first r-list)))
+				 digit)
+				(t number)))
+	    into list
+	    finally (progn
+		      (incf (cadar list) fraction)
+		      (return (nreverse list))))))
+    (unless trailing-zeros
+      (setf format-pairs (member-if #'plusp format-pairs :key
+				    #'second)))
+    (when lsb-first
+      (setf format-pairs (nreverse format-pairs)))
+    (unless leading-zeros
+      (setf format-pairs (member-if #'plusp format-pairs :key
+				    #'second)))
+    (format stream "~{~{~@?~}~}" format-pairs)))
+
+
+(defun format-decimal-degree (degree)
+  (format-mixed-radix-number nil (* 60 degree) '(60 360) '("~,2F´" "~D°")))
+
+(defun format-lon-lat (lon lat)
+  (format nil "~A ~:[S~;N~], ~A~:[W~;E~]"
+	  (format-decimal-degree (abs lat))
+	  (plusp lat)
+	  (format-decimal-degree (abs lon))
+	  (plusp lon)))
+



More information about the Bknr-cvs mailing list