Combine column types defined in dcolumn with tabularx

enter image description here

Never tried it before but....

\documentclass{article}

\usepackage{array}       
\usepackage{tabularx}
\usepackage{dcolumn} 
  \newcolumntype{d}[1]{D{.}{.}{#1}}    
\usepackage{booktabs}


\begin{document}

% table using D from dcolumn package
\begin{table}

  \centering
  \caption{table using dcolumn}
  \begin{tabularx}{\textwidth}{l*{3}{d{-2}}}

  \toprule
            &  \multicolumn{1}{X}{\centering col A} &
 \multicolumn{1}{X}{\centering col B} &
 \multicolumn{1}{X}{\centering col C} \\
 \cmidrule(lr){2-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4}
  \midrule  
       North &      2,228   &   0.300 &  10.6 \\    
       South &        689.2 &   0.8   &   2.6 \\
  \bottomrule

  \end{tabularx}     
\end{table}


\end{document}

I don't see how one might combine the decimal-aligning capabilities of the dcolumn package with the width-setting capabilities of the tabularx package. (However, David Carlisle might just decide to show how this might be done after all. Update: Sure enough, he did!)

You could, though, use the tabular* environment (part of core-LaTeX, no extra package required) along with the dcolumn package. Unlike the tabular environment, which takes one argument (the set of column specifications), tabular* takes two arguments: the overall width, and the set of column specifications. The big difference between tabular* and tabularx is that whereas the latter works by expanding by column widths suitably, the former works by adjusting the amount of intercolumn whitespace.

The "trick", such as it is, is to use the construct @{\extracolsep{\fill}} to expand the intercolumn white space so that the tabular* environment takes up the full width specified in the environment's first argument. In the example below, which is largely adapted from your first example, columns 2, 3, and 4 all have the same widths because of the dcolumn specifier d{6.3}; this can be verified by comparing the lengths of the three \cmidrules. (Aside: because the table features plenty of intercolumn whitespace, it's not necessary to trim the \cmidrules to assure some separation between them.) The columns are separated by equal amounts of intercolumn whitespace, courtesy of the @{\extracolsep{\fill}} directive.

I hope this is, more or less, what you're looking for.

enter image description here

\documentclass{article}
\usepackage{dcolumn} 
\newcolumntype{d}[1]{D{.}{.}{#1}}    
\usepackage{booktabs}
\newcommand{\mc}[1]{\multicolumn{1}{c}{#1}} % handy shortcut macro
\begin{document}
\noindent
The width of the text block is indicated by this horizontal rule:
\hrule

\begin{table}[h] % I'm the "h" location specifier just to assure that the table is typeset after the \hrule...
\caption{Table using dcolumn and tabular*}
\begin{tabular*}{\textwidth}{l@{\extracolsep{\fill}}*{3}{d{6.3}}}
\toprule
&  \mc{col A} & \mc{col B} & \mc{col C} \\ 
\cmidrule{2-2} \cmidrule{3-3} \cmidrule{4-4}
\midrule  
North &      2,228   &   0.300 &  10.6 \\    
South &        689.2 &   0.8   &   2.6 \\
\bottomrule
\end{tabular*}     
\end{table}
\end{document}