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

........
  r70936 | r.david.murray | 2009-03-31 23:21:43 -0400 (Tue, 31 Mar 2009) | 4 lines

  Fix issue 2522.  locale.format now checks that it is passed
  exactly one pattern, which avoids mysterious errors where it
  had seemed to fail to do localization.
........
diff --git a/Lib/locale.py b/Lib/locale.py
index 17056b9..372c955 100644
--- a/Lib/locale.py
+++ b/Lib/locale.py
@@ -11,7 +11,11 @@
 
 """
 
-import sys, encodings, encodings.aliases
+import sys
+import encodings
+import encodings.aliases
+import re
+import collections
 from builtins import str as _builtin_str
 import functools
 
@@ -173,6 +177,9 @@
         amount -= 1
     return s[lpos:rpos+1]
 
+_percent_re = re.compile(r'%(?:\((?P<key>.*?)\))?'
+                         r'(?P<modifiers>[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]')
+
 def format(percent, value, grouping=False, monetary=False, *additional):
     """Returns the locale-aware substitution of a %? specifier
     (percent).
@@ -180,9 +187,13 @@
     additional is for format strings which contain one or more
     '*' modifiers."""
     # this is only for one-percent-specifier strings and this should be checked
-    if percent[0] != '%':
-        raise ValueError("format() must be given exactly one %char "
-                         "format specifier")
+    match = _percent_re.match(percent)
+    if not match or len(match.group())!= len(percent):
+        raise ValueError(("format() must be given exactly one %%char "
+                         "format specifier, %s not valid") % repr(percent))
+    return _format(percent, value, grouping, monetary, *additional)
+
+def _format(percent, value, grouping=False, monetary=False, *additional):
     if additional:
         formatted = percent % ((value,) + additional)
     else:
@@ -206,10 +217,6 @@
             formatted = _strip_padding(formatted, seps)
     return formatted
 
-import re, collections
-_percent_re = re.compile(r'%(?:\((?P<key>.*?)\))?'
-                         r'(?P<modifiers>[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]')
-
 def format_string(f, val, grouping=False):
     """Formats a string in the same way that the % formatting would use,
     but takes the current locale into account.