Duplicate tip
This tip is very similar to the following:
These tips need to be merged – see the merge guidelines.
created 2005 · complexity intermediate · author Michael Fitz · version 5.7
Suppose you have some numbers in an ugly format:
123 2.5678 -13.44 100.5 +47.11
You want to have them nice aligned with 5 decimals written out.
First, we align any line left to the beginning:
:%s§^\s*§§ 123 2.5678 -13.44 100.5 +47.11
Now we split at the decimal-point (if any) and shift the fractional part wide to the right and add five '0' at the end (because we want 5 fractional digts).
:%s§\([-+]\?\d\+\)\.\?\(\d*$\)§\1 !\200000§ 123 !00000 2 !567800000 -13 !4400000 100 !500000 +47 !1100000
This tricky substitue aligns the fractional part at column 15:
:%s§\%15c\s*!§!§ 123 !00000 2 !567800000 -13 !4400000 100 !500000 +47 !1100000
Now we shift the integral part back by exchanging it with leading spaces (and replacing '!' by decimal-point):
:%s§\(^\S*\)\(\s*\)!§\2\1.§ 123.00000 2.567800000 -13.4400000 100.500000 +47.1100000
Now we truncate each fractional part to 5 digits:
:%s§\%21c\d*§§ 123.00000 2.56780 -13.44000 100.50000 +47.11000
Finally we add a '+'-sign where it's missing:
:%s§\s\(\d\)§+\1§ +123.00000 +2.56780 -13.44000 +100.50000 +47.11000
I usually use the (german) paragraph-sign '§' to surround the substitute-patterns, because this letter is very seldom used in any IT-related context.
Comments[]
Using AlignMaps[]
See VimTip139 for AlignMaps which provides the \anum
(actually <Leader>anum) to do something similar:
123 2.5678 -13.44 100.5 +47.11
It doesn't append the zeros, just does a numeric alignment. \anum
also handles the use of commas instead of periods, European style.
Using Tabular[]
A column of numbers can be aligned with the Tabular plugin as well:
1231
342.234
23.322
35252
23.232355
0.555421231
:'<,'>Tabularize /\./r0l0l0
1231
342.234
23.322
35252
23.232355
0.555421231
Any symbol may be used instead of the period and more complex patterns are also possible.