Browse Source

support center spec

blueloveTH 2 years ago
parent
commit
25cca8c58f
2 changed files with 27 additions and 5 deletions
  1. 15 4
      src/vm.cpp
  2. 12 1
      tests/25_rawstring.py

+ 15 - 4
src/vm.cpp

@@ -405,7 +405,10 @@ PyObject* VM::format(Str spec, PyObject* obj){
         }
     }
     char align;
-    if(spec[0] == '>'){
+    if(spec[0] == '^'){
+        align = '^';
+        spec = spec.substr(1);
+    }else if(spec[0] == '>'){
         align = '>';
         spec = spec.substr(1);
     }else if(spec[0] == '<'){
@@ -452,9 +455,17 @@ PyObject* VM::format(Str spec, PyObject* obj){
     }
     if(width != -1 && width > ret.length()){
         int pad = width - ret.length();
-        std::string padding(pad, pad_c);
-        if(align == '>') ret = padding.c_str() + ret;
-        else ret = ret + padding.c_str();
+        if(align == '>' || align == '<'){
+            std::string padding(pad, pad_c);
+            if(align == '>') ret = padding.c_str() + ret;
+            else ret = ret + padding.c_str();
+        }else{  // ^
+            int pad_left = pad / 2;
+            int pad_right = pad - pad_left;
+            std::string padding_left(pad_left, pad_c);
+            std::string padding_right(pad_right, pad_c);
+            ret = padding_left.c_str() + ret + padding_right.c_str();
+        }
     }
     return VAR(ret);
 }

+ 12 - 1
tests/25_rawstring.py

@@ -35,6 +35,10 @@ assert f'{a:>10}' == '        10'
 assert f'{a:<10}' == '10        '
 assert f'{a:<10.2f}' == '10.00     '
 assert f'{a:>10.2f}' == '     10.00'
+
+assert f'{a:^10}' == '    10    '
+assert f'{a:^10.2f}' == '  10.00   '
+
 assert f'{a:3d}' == ' 10'
 assert f'{a:10d}' == '        10'
 assert f'{a:1d}' == '10'
@@ -60,4 +64,11 @@ assert f'{obj.b:10s}' == '123       '
 
 a = [(1,2), 3, obj]
 assert f'{a[0][1]}' == '2'
-assert f'abc{a[-1].b:10}==={1234}' == 'abc123       ===1234'
+assert f'abc{a[-1].b:10}==={1234}' == 'abc123       ===1234'
+
+assert f'{"text":10}' == 'text      '
+assert f'{"test":*>10}' == '******test'
+assert f'{"test":*<10}' == 'test******'
+assert f'{"test":*^10}' == '***test***'
+assert f'{"test":*^11}' == '***test****'
+assert f'{12345:0>10}' == '0000012345'