diff --git a/.gitignore b/.gitignore
index c909359..bde949c 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+venv
 *.pyc
 *.pyo
 
diff --git a/README.rst b/README.rst
index e01aaaf..df881ea 100644
--- a/README.rst
+++ b/README.rst
@@ -132,7 +132,7 @@ format specification might have been used.
 
 Most of `format()`'s `Format Specification Mini-Language`_ is supported:
 
-   [[fill]align][0][width][.precision][type]
+   [[fill]align][sign][0][width][.precision][type]
 
 The differences between `parse()` and `format()` are:
 
@@ -143,7 +143,8 @@ The differences between `parse()` and `format()` are:
   That is, the "#" format character is handled automatically by d, b, o
   and x formats. For "d" any will be accepted, but for the others the correct
   prefix must be present if at all.
-- Numeric sign is handled automatically.
+- Numeric sign is handled automatically.  A sign specifier can be given, but
+  has no effect.
 - The thousands separator is handled automatically if the "n" type is used.
 - The types supported are a slightly different mix to the format() types.  Some
   format() types come directly over: "d", "n", "%", "f", "e", "b", "o" and "x".
diff --git a/parse.py b/parse.py
index 062a421..e5db401 100644
--- a/parse.py
+++ b/parse.py
@@ -758,7 +758,7 @@ ALLOWED_TYPES = set(list('nbox%fFegwWdDsSl') + ['t' + c for c in 'ieahgcts'])
 
 
 def extract_format(format, extra_types):
-    """Pull apart the format [[fill]align][0][width][.precision][type]"""
+    """Pull apart the format [[fill]align][sign][0][width][.precision][type]"""
     fill = align = None
     if format[0] in '<>=^':
         align = format[0]
@@ -768,6 +768,9 @@ def extract_format(format, extra_types):
         align = format[1]
         format = format[2:]
 
+    if format.startswith(('+', '-', ' ')):
+        format = format[1:]
+
     zero = False
     if format and format[0] == '0':
         zero = True
@@ -1261,11 +1264,11 @@ class Parser(object):
 
         # align "=" has been handled
         if align == '<':
-            s = '%s%s+' % (s, fill)
+            s = '%s%s*' % (s, fill)
         elif align == '>':
             s = '%s*%s' % (fill, s)
         elif align == '^':
-            s = '%s*%s%s+' % (fill, s, fill)
+            s = '%s*%s%s*' % (fill, s, fill)
 
         return s
 

diff --git a/test_parse.py b/test_parse.py
index 1752a42..2392686 100755
--- a/test_parse.py
+++ b/test_parse.py
@@ -205,6 +205,17 @@ class TestParse(unittest.TestCase):
         r = parse.parse('hello {:w} {:w}', 'hello 12 people')
         self.assertEqual(r.fixed, ('12', 'people'))
 
+    def test_sign(self):
+        # sign is ignored
+        r = parse.parse('Pi = {:.7f}', 'Pi = 3.1415926')
+        self.assertEqual(r.fixed, (3.1415926,))
+        r = parse.parse('Pi = {:+.7f}', 'Pi = 3.1415926')
+        self.assertEqual(r.fixed, (3.1415926,))
+        r = parse.parse('Pi = {:-.7f}', 'Pi = 3.1415926')
+        self.assertEqual(r.fixed, (3.1415926,))
+        r = parse.parse('Pi = {: .7f}', 'Pi = 3.1415926')
+        self.assertEqual(r.fixed, (3.1415926,))
+
     def test_precision(self):
         # pull a float out of a string
         r = parse.parse('Pi = {:.7f}', 'Pi = 3.1415926')
@@ -865,17 +876,22 @@ class TestBugs(unittest.TestCase):
         # prior to the fix, this would raise an AttributeError
         pickle.dumps(p)
 
-    def test_search_centered_bug_112(self):
-        r = parse.parse("{:^},{:^}", " 12 , 34 ")
-        self.assertEqual(r[1], "34")
-        r = parse.search("{:^},{:^}", " 12 , 34 ")
-        self.assertEqual(r[1], "34")
-
-    def test_search_left_align_bug_112(self):
-        r = parse.parse("{:<},{:<}", "12 ,34 ")
-        self.assertEqual(r[1], "34")
-        r = parse.search("{:<},{:<}", "12 ,34 ")
-        self.assertEqual(r[1], "34")
+    def test_unused_centered_alignment_bug(self):
+        r = parse.parse("{:^2S}", "foo")
+        self.assertEqual(r[0], "foo")
+        r = parse.search("{:^2S}", "foo")
+        self.assertEqual(r[0], "foo")
+
+        # specifically test for the case in issue #118 as well
+        r = parse.parse("Column {:d}:{:^}", "Column 1: Timestep")
+        self.assertEqual(r[0], 1)
+        self.assertEqual(r[1], "Timestep")
+
+    def test_unused_left_alignment_bug(self):
+        r = parse.parse("{:<2S}", "foo")
+        self.assertEqual(r[0], "foo")
+        r = parse.search("{:<2S}", "foo")
+        self.assertEqual(r[0], "foo")
 
     def test_match_trailing_newline(self):
         r = parse.parse('{}', 'test\n')

seach cut the result with {:^}
from parse impor *
str = '     12  ,      34   '

# Incorrect with search
print(search('{:^},{:^}', a))
<Result ('12', '3') {}>

# Correct with parse
print(parse('{:^},{:^}', a))
<Result ('12', '34') {}>

test_parse.py::TestParse::test_sign test_parse.py::TestBugs::test_unused_centered_alignment_bug test_parse.py::TestBugs::test_unused_left_alignment_bug
test_parse.py::TestPattern::test_bird test_parse.py::TestPattern::test_braces test_parse.py::TestPattern::test_dict_style_fields test_parse.py::TestPattern::test_dot_separated_fields test_parse.py::TestPattern::test_dot_separated_fields_name_collisions test_parse.py::TestPattern::test_fixed test_parse.py::TestPattern::test_format_variety test_parse.py::TestPattern::test_invalid_groupnames_are_handled_gracefully test_parse.py::TestPattern::test_named test_parse.py::TestPattern::test_named_typed test_parse.py::TestPattern::test_numbered test_parse.py::TestResult::test_contains test_parse.py::TestResult::test_fixed_access test_parse.py::TestResult::test_named_access test_parse.py::TestResult::test_slice_access test_parse.py::TestParse::test_center test_parse.py::TestParse::test_custom_type test_parse.py::TestParse::test_datetime_group_count test_parse.py::TestParse::test_datetimes test_parse.py::TestParse::test_fixed test_parse.py::TestParse::test_hexadecimal test_parse.py::TestParse::test_left test_parse.py::TestParse::test_letters test_parse.py::TestParse::test_mixed test_parse.py::TestParse::test_mixed_type_variant test_parse.py::TestParse::test_mixed_types test_parse.py::TestParse::test_multiline test_parse.py::TestParse::test_named test_parse.py::TestParse::test_named_aligned_typed test_parse.py::TestParse::test_named_repeated test_parse.py::TestParse::test_named_repeated_fail_value test_parse.py::TestParse::test_named_repeated_type test_parse.py::TestParse::test_named_repeated_type_fail_value test_parse.py::TestParse::test_named_repeated_type_mismatch test_parse.py::TestParse::test_named_typed test_parse.py::TestParse::test_no_evaluate_result test_parse.py::TestParse::test_no_match test_parse.py::TestParse::test_nothing test_parse.py::TestParse::test_numbers test_parse.py::TestParse::test_pipe test_parse.py::TestParse::test_precision test_parse.py::TestParse::test_question_mark test_parse.py::TestParse::test_regular_expression test_parse.py::TestParse::test_right test_parse.py::TestParse::test_spans test_parse.py::TestParse::test_too_many_fields test_parse.py::TestParse::test_two_datetimes test_parse.py::TestParse::test_typed test_parse.py::TestParse::test_typed_fail test_parse.py::TestParse::test_unicode test_parse.py::TestSearch::test_basic test_parse.py::TestSearch::test_multiline test_parse.py::TestSearch::test_no_evaluate_result test_parse.py::TestSearch::test_pos test_parse.py::TestFindall::test_case_sensitivity test_parse.py::TestFindall::test_findall test_parse.py::TestFindall::test_no_evaluate_result test_parse.py::TestBugs::test_dotted_type_conversion_pull_8 test_parse.py::TestBugs::test_match_trailing_newline test_parse.py::TestBugs::test_named_date_issue7 test_parse.py::TestBugs::test_pickling_bug_110 test_parse.py::TestBugs::test_pm_handling_issue57 test_parse.py::TestBugs::test_pm_overflow_issue16 test_parse.py::TestBugs::test_tz_compare_to_None test_parse.py::TestBugs::test_unmatched_brace_doesnt_match test_parse.py::TestBugs::test_user_type_with_group_count_issue60 test_parse.py::TestParseType::test_case_sensitivity test_parse.py::TestParseType::test_decimal_value test_parse.py::TestParseType::test_int_convert_stateless_base test_parse.py::TestParseType::test_pattern_should_be_used test_parse.py::TestParseType::test_pattern_should_be_used2 test_parse.py::TestParseType::test_width_constraints test_parse.py::TestParseType::test_width_empty_input test_parse.py::TestParseType::test_width_multi_int test_parse.py::TestParseType::test_width_str test_parse.py::TestParseType::test_with_pattern test_parse.py::TestParseType::test_with_pattern_and_regex_group_count test_parse.py::TestParseType::test_with_pattern_and_regex_group_count_is_none test_parse.py::TestParseType::test_with_pattern_and_wrong_regex_group_count_raises_error