diff --git a/src/vm.cpp b/src/vm.cpp index 0da7a0a3..bf743f18 100644 --- a/src/vm.cpp +++ b/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); } diff --git a/tests/25_rawstring.py b/tests/25_rawstring.py index 8b5d526c..c3fa1f7a 100644 --- a/tests/25_rawstring.py +++ b/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' \ No newline at end of file +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' \ No newline at end of file