public String toString() 
    {
        PrintfFormat fmt = new PrintfFormat(cellFormat);
        StringBuffer buf = new StringBuffer();
        // line 1 - a ruler
        buf.append("   ");  buf.append("   ");
        for (int i=1; i<=s.length(); i++) buf.append(fmt.sprintf((double)i));
        buf.append("\n");
        // line 2 - the string
        buf.append("   "); buf.append("   ");
        for (int i=1; i<=s.length(); i++) buf.append(" "+trapNewline(sAt(i))+" ");
        buf.append("\n");
        // line 2 - an hrule
        buf.append("   "); buf.append("   ");
        for (int i=1; i<=s.length(); i++) buf.append("---");
        buf.append("\n");
        // remaining lines
        for (int j=1; j<=t.length(); j++) {
            buf.append(fmt.sprintf((double)j));
	    buf.append(" "+trapNewline(tAt(j))+"|");
	    for (int i=1; i<=s.length(); i++) {
                if (!nearDiagonal(offsetFromDiagonal(i,j)) || defaultValue==get(i,j)) {
                    buf.append(" * ");
                } else {
                    double v = printNegativeValues ? -get(i,j) : get(i,j);
                    buf.append(fmt.sprintf(v));
                }
	    }
	    buf.append("\n");
        }
        return buf.toString();
    }