Vim Tips Wiki
Advertisement

Duplicate tip

This tip is very similar to the following:

These tips need to be merged – see the merge guidelines.

Tip 893 Printable Monobook Previous Next

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.


Advertisement