Update of /project/cl-l10n/cvsroot/cl-l10n In directory common-lisp.net:/tmp/cvs-serv19681
Modified Files: ChangeLog cl-l10n.asd parse-number.lisp parsers.lisp printers.lisp tests.lisp Log Message: Changelog 2004-12-17 Date: Fri Dec 17 11:06:43 2004 Author: sross
Index: cl-l10n/ChangeLog diff -u cl-l10n/ChangeLog:1.5 cl-l10n/ChangeLog:1.6 --- cl-l10n/ChangeLog:1.5 Wed Dec 8 11:02:23 2004 +++ cl-l10n/ChangeLog Fri Dec 17 11:06:43 2004 @@ -1,6 +1,17 @@ +2004-12-17 Sean Ross sross@common-lisp.net + * printers.lisp: Fixed incorrect sign when printing + numbers and money. + * printers.lisp: The :no-dp arg whas ignored when + printing numbers, fixed. + * printers.lisp: Added *float-digits*. Used when printing + numbers, when all numbers after the decimal point are zero + only *float-digits* zeros will be printed. + * printers.lisp: Fixed format to accept a function as the + format control. + 2004-12-08 Sean Ross sross@common-lisp.net * printers.lisp: Added format which can be shadow imported - to provide 3 new format directive ~u(universal-time), ~m(monetary) + to provide 3 new format directives ~u(universal-time), ~m(monetary) and ~n(numeric), all other directives are unchanged. * printers.lisp: Use locale-t-fmt if locale-t-fmt-ampm is an empty string.
Index: cl-l10n/cl-l10n.asd diff -u cl-l10n/cl-l10n.asd:1.5 cl-l10n/cl-l10n.asd:1.6 --- cl-l10n/cl-l10n.asd:1.5 Wed Dec 8 11:02:23 2004 +++ cl-l10n/cl-l10n.asd Fri Dec 17 11:06:43 2004 @@ -11,7 +11,7 @@ :name "CL-L10N" :author "Sean Ross sdr@jhb.ucs.co.za" :maintainer "Sean Ross sdr@jhb.ucs.co.za" - :version "0.1.7" + :version "0.1.10" :description "Portable CL Locale Support" :long-description "Portable CL Package to support localization" :licence "MIT"
Index: cl-l10n/parse-number.lisp diff -u cl-l10n/parse-number.lisp:1.1 cl-l10n/parse-number.lisp:1.2 --- cl-l10n/parse-number.lisp:1.1 Wed Dec 8 11:02:23 2004 +++ cl-l10n/parse-number.lisp Fri Dec 17 11:06:43 2004 @@ -303,15 +303,4 @@ :end end :radix radix)))))))) -(defparameter *test-values* - '("1" "-1" "1034" "-364" "80/335" "3.5333" "2.4E4" "6.8d3" "#xFF" "#b-1000" "#o-101/75" "13.09s3" "35.66l5" "21.4f2" "#C(1 2)" "#c ( #xF #o-1 ) " "#c(1d1 2s1)" "#16rFF" "#9r10" "#C(#9r44/61 4f4)")) - -(defun run-tests () - (format t "~&~16@A (~16@A) = ~16A~%~%" - "String value" "READ value" "Parsed value") - (dolist (value *test-values*) - (format t "~&~16@A (~16@A) = ~16A~%" - value - (read-from-string value) - (%parse-number value))))
Index: cl-l10n/parsers.lisp diff -u cl-l10n/parsers.lisp:1.1 cl-l10n/parsers.lisp:1.2 --- cl-l10n/parsers.lisp:1.1 Wed Dec 8 11:02:23 2004 +++ cl-l10n/parsers.lisp Fri Dec 17 11:06:43 2004 @@ -19,4 +19,5 @@ (t num))))
+;; money parser ;; EOF
Index: cl-l10n/printers.lisp diff -u cl-l10n/printers.lisp:1.5 cl-l10n/printers.lisp:1.6 --- cl-l10n/printers.lisp:1.5 Wed Dec 8 11:02:23 2004 +++ cl-l10n/printers.lisp Fri Dec 17 11:06:43 2004 @@ -15,9 +15,9 @@ sign (mapcar #'nreverse (nreverse (group digits grouping))))))
(defun get-sign (arg locale) - (if (plusp arg) - (locale-positive-sign locale) - (locale-negative-sign locale))) + (cond ((plusp arg) (locale-positive-sign locale)) + ((minusp arg) (locale-negative-sign locale)) + (t "")))
(defun get-point (locale no-point float-part) (if (and (string= float-part "0") no-point) @@ -35,17 +35,29 @@ (string (locale loc)) (symbol (locale (string loc)))))
+(defvar *float-digits* 2 + "Used when all values after the decimal point are zero to +determine the number of zero's to print") + (defun format-number (stream arg no-dp no-ts &optional (locale *locale*)) (let ((locale (locale-des->locale locale))) (multiple-value-bind (int-part float-part) (split-float (abs (float arg))) (let* ((sign (get-sign arg locale)) (point (get-point locale no-dp float-part)) + (float-part (if (every #'(lambda (x) + (zerop (or (digit-char-p x) 1))) + float-part) + (make-string *float-digits* + :initial-element #\0) + float-part)) (sep (get-sep locale no-ts)) - (grouping (locale-grouping locale)) - (*read-eval* nil)) + (grouping (locale-grouping locale))) (print-int stream sign int-part sep grouping) - (unless (and (or* (string= float-part "" "0")) no-dp) + (unless (and (every #'(lambda (x) + (zerop (or (digit-char-p x) 1))) + float-part) + no-dp) (princ point stream) (princ float-part stream))))))
@@ -94,7 +106,7 @@ (locale-int-curr-symbol locale) (locale-currency-symbol locale))) (sym-sep (if (zerop sep-by-space) "" " "))) - + (when (or* (= spos 0 1 3)) (princ (if (zerop spos) "(" sign) stream) (when (= 2 sep-by-space) @@ -361,8 +373,12 @@
;; Format
-(defun format (stream fmt-string &rest args) - (apply #'cl:format stream (parse-fmt-string fmt-string) args)) +(defun format (stream fmt-cntrl &rest args) + (apply #'cl:format stream + (etypecase fmt-cntrl + (function fmt-cntrl) + (string (parse-fmt-string fmt-cntrl))) + args))
(defun parse-fmt-string (string) (with-output-to-string (fmt-string)
Index: cl-l10n/tests.lisp diff -u cl-l10n/tests.lisp:1.2 cl-l10n/tests.lisp:1.3 --- cl-l10n/tests.lisp:1.2 Wed Dec 8 11:02:23 2004 +++ cl-l10n/tests.lisp Fri Dec 17 11:06:43 2004 @@ -23,11 +23,11 @@
(deftest number.3 (format nil "~v/cl-l10n:format-number/" "en_ZA" 1000) - "1,000.0") + "1,000.00")
(deftest number.4 (format nil "~v/cl-l10n:format-number/" "sv_SE" 1000) - "1 000,0") + "1 000,00")
(deftest number.5 (format nil "~v:/cl-l10n:format-number/" "sv_SE" 1000)