from Significant Figures by Teck Por Lim
Workaround for fprintf/sprintf to produce correct output for signficant figures, as fprintf/sprintf

sigfig(matNum, nSigFig, strPad)
%[strOut2] = sigfig(matNum, nSigFig, strPad)
%Rounds number to nSigFig number of significant figures and outputs a string
%'pad' in 3rd argument to have padded zeros, else unpadded
%if number of arguments < 3, then choose shorter output, between padded and unpadded
%if number of arguments < 2, then 3 significant figures
%Lim Teck Por, 2006, 2008, 2009
%Apropos: mat2str, num2str, sprintf

function [strOut2] = sigfig(matNum, nSigFig, strPad)
[N, D] = size(matNum);
if (nargin < 2)
    nSigFig = 3;
end
if (nargin < 3)
    strPad = [];
end

strOut2 = [];
for l = 1:N
    for k = 1:D
        numkl = matNum(l,k);
        if (isnan(numkl)||isinf(numkl)) %if nan or inf
            strOut = num2str(numkl);
            mySign = [];
        else %if neither nan or inf
            if (sign(numkl) == -1)
                mySign = '-';
            else
                mySign = [];
            end
            num = abs(numkl);
            nSigFig1 = nSigFig - 1;
            strFormat = ['%1.',(num2str(nSigFig+2)),'e'];

            strTemp = sprintf(strFormat, num);
            [strPrefix,strExponent] = strtok(strTemp, 'e');
            strExponent = strExponent(2:end);
            strFactor = num2str(nSigFig1);
            nTemp = str2num([strPrefix, 'e', strFactor]);
            nExponent = str2num(strExponent);
            fTemp = str2num([num2str(round(nTemp)), 'e', num2str(nExponent-nSigFig1)]);

            strTemp = sprintf(strFormat, fTemp);
            [strPrefix,strExponent] = strtok(strTemp, 'e');
            strExponent = strExponent(2:end);
            while (strExponent(2) == '0') && (length(strExponent) > 2)
                strExponent = [strExponent(1), strExponent(3:end)];
            end
            [strPrefix2,strSuffix2] = strtok(strPrefix, '.');
            strSuffix2 = strSuffix2(2:end);
            if (str2num(strSuffix2(nSigFig)) >= 5)
                nTemp = str2num([strPrefix2,strSuffix2(1:nSigFig1)])+1;
                strTemp2 = num2str(nTemp);
                strPrefix2 = strTemp2(1);
                strSuffix2 = strTemp2(2:end);
            else
                strSuffix2(nSigFig:end) = [];
            end
            if (nargin < 3) %if zero padding
                strOuta = zeroPadding(strPrefix2, strSuffix2, strExponent, nSigFig, num, strPad);
                if (nSigFig1 == 0)
                    strOutb = [strPrefix2, strSuffix2, 'e', strExponent];
                else
                    strOutb = [strPrefix2, '.', strSuffix2, 'e', strExponent];
                end
                if(length(strOuta)<length(strOutb))
                    strOut = strOuta;
                else
                    strOut = strOutb;
                end
            else %if no zero padding
                if (strcmp(strPad,'pad'))
                    strOut = zeroPadding(strPrefix2, strSuffix2, strExponent, nSigFig, num, strPad);
                else
                    if (nSigFig1 == 0)
                        strOut = [strPrefix2, strSuffix2, 'e', strExponent];
                    else
                        strOut = [strPrefix2, '.', strSuffix2, 'e', strExponent];
                    end
                end
            end %if no zero padding
            if (strOut(end)=='.')
                strOut = strOut(1:end-1);
            end
            if (length(strOut) > 5)
                if (strcmpi(strOut(end-2:end), 'e+0'))
                    strOut = strOut(1:end-3);
                end
            end
        end %if neither nan or inf
        strOut2 = [strOut2, mySign, strOut];
        if (k<D)
            strOut2 = [strOut2, ','];
        end
    end
    if (l<N)
        strOut2 = [strOut2, ';'];
    else
        strOut2 = sprintf('%s', strOut2);
    end
end

function [strOut] = zeroPadding(strPrefix2, strSuffix2, strExponent, nSigFig, num, strPad)
nDP = str2num(strExponent);
if (nDP < 0) %nDP < 0
    strZeros = char(repmat(48,1,abs(nDP)-1));
    strOut = ['0.', strZeros, strPrefix2, strSuffix2];
else %nDP >= 0
    nP = length(strPrefix2);
    nS = length(strSuffix2);
    nPad =  nSigFig - nP - nS;
    if (nPad > 0)
        strZeros = char(repmat(48,1,nPad));
    else
        strZeros = [];
    end
    if (nDP == 0) %nDP = 0
        strOut = [strPrefix2, '.', strSuffix2, strZeros];
    else %nDP > 0
        %nOut = str2num([strPrefix2, '.', strSuffix2]);
        %strOut = num2str(nOut*10^nDP);
        nPad1 = nDP - nS;
        strZeros1 = char(repmat(48,1,nPad1));
        strTemp = [strSuffix2, strZeros1];
        strOut = [strPrefix2, strTemp(1:nDP), '.', strTemp(nDP+1:end)];
        nPad2 = nSigFig - length(strOut);
        if (nPad2 > 0)
            strZeros2 = char(repmat(48,1,nPad2));
            strOut = [strOut, '.', strZeros2];
        end
    end %nDP > 0
end %nDP >= 0

Contact us at files@mathworks.com