[Python-3000-checkins] r64500 - in python/branches/py3k: Lib/test/test_types.py Objects/stringlib/formatter.h

eric.smith python-3000-checkins at python.org
Tue Jun 24 13:21:04 CEST 2008


Author: eric.smith
Date: Tue Jun 24 13:21:04 2008
New Revision: 64500

Log:
Merged revisions 64499 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r64499 | eric.smith | 2008-06-24 07:11:59 -0400 (Tue, 24 Jun 2008) | 1 line
  
  Fixed formatting with thousands separator and padding.  Resolves issue 3140.
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/test/test_types.py
   python/branches/py3k/Objects/stringlib/formatter.h

Modified: python/branches/py3k/Lib/test/test_types.py
==============================================================================
--- python/branches/py3k/Lib/test/test_types.py	(original)
+++ python/branches/py3k/Lib/test/test_types.py	Tue Jun 24 13:21:04 2008
@@ -428,6 +428,14 @@
             # move to the next integer to test
             x = x // 10
 
+        rfmt = ">20n"
+        lfmt = "<20n"
+        cfmt = "^20n"
+        for x in (1234, 12345, 123456, 1234567, 12345678, 123456789, 1234567890, 12345678900):
+            self.assertEqual(len(format(0, rfmt)), len(format(x, rfmt)))
+            self.assertEqual(len(format(0, lfmt)), len(format(x, lfmt)))
+            self.assertEqual(len(format(0, cfmt)), len(format(x, cfmt)))
+
     def test_float__format__(self):
         # these should be rewritten to use both format(x, spec) and
         # x.__format__(spec)

Modified: python/branches/py3k/Objects/stringlib/formatter.h
==============================================================================
--- python/branches/py3k/Objects/stringlib/formatter.h	(original)
+++ python/branches/py3k/Objects/stringlib/formatter.h	Tue Jun 24 13:21:04 2008
@@ -313,8 +313,8 @@
    as determined in _calc_integer_widths().  returns the pointer to
    where the digits go. */
 static STRINGLIB_CHAR *
-fill_number(STRINGLIB_CHAR *p_buf, const NumberFieldWidths *spec,
-            Py_ssize_t n_digits, STRINGLIB_CHAR fill_char)
+fill_non_digits(STRINGLIB_CHAR *p_buf, const NumberFieldWidths *spec,
+		Py_ssize_t n_digits, STRINGLIB_CHAR fill_char)
 {
     STRINGLIB_CHAR* p_digits;
 
@@ -557,17 +557,17 @@
 	pnumeric_chars += leading_chars_to_skip;
     }
 
-    /* Calculate the widths of the various leading and trailing parts */
-    calc_number_widths(&spec, sign, n_digits, format);
-
     if (format->type == 'n')
 	    /* Compute how many additional chars we need to allocate
 	       to hold the thousands grouping. */
 	    STRINGLIB_GROUPING(NULL, n_digits, n_digits,
 			       0, &n_grouping_chars, 0);
 
+    /* Calculate the widths of the various leading and trailing parts */
+    calc_number_widths(&spec, sign, n_digits + n_grouping_chars, format);
+
     /* Allocate a new string to hold the result */
-    result = STRINGLIB_NEW(NULL, spec.n_total + n_grouping_chars);
+    result = STRINGLIB_NEW(NULL, spec.n_total);
     if (!result)
 	goto done;
     p = STRINGLIB_STR(result);
@@ -587,7 +587,7 @@
 
     /* Insert the grouping, if any, after the uppercasing of 'X', so we can
        ensure that grouping chars won't be affected. */
-    if (n_grouping_chars && format->type == 'n') {
+    if (n_grouping_chars) {
 	    /* We know this can't fail, since we've already
 	       reserved enough space. */
 	    STRINGLIB_CHAR *pstart = p + n_leading_chars;
@@ -597,9 +597,9 @@
 	    assert(r);
     }
 
-    /* Fill in the non-digit parts */
-    fill_number(p, &spec, n_digits,
-                format->fill_char == '\0' ? ' ' : format->fill_char);
+    /* Fill in the non-digit parts (padding, sign, etc.) */
+    fill_non_digits(p, &spec, n_digits + n_grouping_chars,
+		    format->fill_char == '\0' ? ' ' : format->fill_char);
 
 done:
     Py_XDECREF(tmp);
@@ -737,9 +737,9 @@
     if (result == NULL)
         goto done;
 
-    /* fill in the non-digit parts */
-    fill_number(STRINGLIB_STR(result), &spec, n_digits,
-                format->fill_char == '\0' ? ' ' : format->fill_char);
+    /* Fill in the non-digit parts (padding, sign, etc.) */
+    fill_non_digits(STRINGLIB_STR(result), &spec, n_digits,
+		    format->fill_char == '\0' ? ' ' : format->fill_char);
 
     /* fill in the digit parts */
     memmove(STRINGLIB_STR(result) +


More information about the Python-3000-checkins mailing list