Align numbers at decimal point
Talk0this wiki
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
Edit
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.