I don't know about the “good ol’ plainTeX” way, but you can use an additional column that is right aligned (as + and – have the same horizontal width the alignment doesn't really matter).
Basis
\begin{tabular}{*{2}{r@{}N{4}{2}}}
\toprule
$-$ & 940 & + & 1000 \\
+ & 952.38 & $-$ & 1000 \\ \midrule
+ & 12.38 & & 0 \\
\bottomrule
\end{tabular}
The padding is still be done by numprint but with @{} we force that + and – are being typeset without any further space.
As this is probably needed a lot more times, with the use of the array package we define another column specification:
\newcolumntype{M}[2]{r@{}N{#1}{#2}}
It can be used, for example, as M{4}{2}.
Typing all those ampersands is a bit tedious so we make + and - active so that they insert the ampersands on its own, but we don't want this to affect the whole document, only our special tabular should have this effect, therefore I defined a new ntabular environment that is basically just a wrapper for a tabular environment with active + and -.
(I didn't introduce another character that “automatically” expands to &, because … you can just use &, can't you? Unfortunatly, this is still needed if you have no sign in front of a number.)
Code
\documentclass{article}
\usepackage{booktabs,numprint,array}
\begingroup
\catcode`-=\active
\catcode`+=\active
\gdef-{$\char`-$&}
\gdef+{\char`+&}
\endgroup
\newenvironment{ntabular}[1]{%
\catcode`-=\active
\catcode`+=\active
\tabular{#1}
}{%
\endtabular
}
\newcolumntype{M}[2]{r@{}N{#1}{#2}}
\begin{document}
Is it safe to use + and -?
\begin{table}[h]
\begin{ntabular}{M{3}{2}M{4}{2}}
\toprule
- 940 & + 1000 \\
+ 952.38 & - 1000 \\ \midrule
+ 12.38 & & 0 \\
\bottomrule
\end{ntabular}
\end{table}
Is it safe to use + and -?
\end{document}
Output

numprintpackage, butsiunitxoffers you aligning at the decimal sign. – Qrrbrbirlbel Oct 14 '12 at 16:32\nplpadding[\hphantom{0}]{4}, but it fails. (A space has not the same width as a digit.) – Qrrbrbirlbel Oct 14 '12 at 16:58+and$-$):{*{2}{r@{}N{4}{2}}}– Qrrbrbirlbel Oct 14 '12 at 17:26