Search code examples
javadisplaytagnumber-formatting

how to format currency in displaytag


I am getting the value of amount like 4567.00 , 8976.00 etc. Now while dispalying this value in displaytag i would like to print it as $4567.00 instead of just 4567.00. How can i do that? Provided i just want to use display tag. I can acheive the same thing using core:out tag.

$<core:out value="${variableInMyList}" />

Answer Found [ How i did it ]

Create a new class:

public class NumberFormatDecorator implements DisplaytagColumnDecorator{
    Logger logger = MyLogger.getInstance ( );

    public Object decorate(Object columnValue, PageContext pageContext, MediaTypeEnum media) throws DecoratorException {        
        try
        {
            Object colVal = columnValue;
            if ( columnValue != null ){
                colVal = Double.parseDouble( (String)columnValue );
            }
            return colVal;
        }catch ( Exception nfe ){}
        logger.error( "Unable to convert to Numeric Format");
        return columnValue; // even if there is some exception return the original value
    }
}

now in display tag

<displaytag:column title="Amount" property="amount" decorator="com.rj.blah.utils.decorator.NumberFormatDecorator" format="$ {0,number,0,000.00}"/>

Note: we can use the MessageFormat in format attribute of displaytag:column


Solution

  • DisplayTab is not very JSTL or EL friendly, and doesn't support that style of formatting. Instead, you need to extend the TableDecorator class and put a reference to it using the decorator attribute of the display:table tag.

    Your decorator subclass should define a getter method for your formatted currency column, something like:

    public class MyTableDecorator extends TableDecorator {
        public String getCurrency() {
            MyRowType row = getCurrentRowObject();
            return row.getCurrency.format();
        }
    }
    

    and

    <display:table name="myList" decorator="test.MyTableDecorator">
        <display:column property="myProperty" title="My Property"/>
        <display:column property="currency" title="Currency"/>
    </display:table>
    

    Alternatively, you can implement the DisplaytagColumnDecorator interface, and reference that decorator from the JSP:

    <display:table name="myList">
        <display:column property="myProperty" title="My Property"/>
        <display:column property="currency" title="Currency" decorator="test.MyColumnDecorator"/>
    </display:table>
    

    See the documentation for more information