quinta-feira, 19 de março de 2009

Implementando conversor de moeda com JSF

Algumas pessoas já devem ter passado pelo problema de criar um conversor de moedas em JSF que funcione bem para diferentes países. Segue abaixo uma sugestão de como implementar um conversor legal.

O primeiro passo é implementar a classe de conversor. Segue abaixo a classe:

public class MoedaConverter implements Converter {

@Override
public Object getAsObject(FacesContext facesContext,
UIComponent uiComponent, String value) {

FacesContext fc = FacesContext.getCurrentInstance();
Locale l = fc.getViewRoot().getLocale();

if (value != null) {
value = value.trim();
if (value.length() > 0) {
try {
return new BigDecimal(NumberFormat.
getNumberInstance(l).parse(
value).doubleValue());
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return null;
}

@Override
public String getAsString(FacesContext facesContext,
UIComponent uiComponent, Object value) {

if (value == null) {
return "";
}
if (value instanceof String) {
return (String) value;
}
try {
FacesContext fc = FacesContext.getCurrentInstance();
Locale l = fc.getViewRoot().getLocale();
NumberFormat formatador = NumberFormat.getNumberInstance(l);
formatador.setGroupingUsed(true);
return formatador.format(value);

} catch (Exception e) {
throw new ConverterException("Formato não é número.");
}
}
}

Depois deve-se adicionar o seguinte trecho no arquivo faces-config.xml:

<converter>
<converter-id>MoedaConverter</converter-id>
<converter-class>
com.converter.DoubleConverter
</converter-class>
</converter>


Para utilizá-lo agora basta utilizar da seguinte maneira:
   <h:inputText id="moeda"
label="#{msgs.campo_geral_volume_compra}"
value="#{enderecoBean.valor}">
<f:converter converterId="MoedaConverter" />
</h:inputText>
Não se esqueça que este conversor não é também máscara de javascript. Então é importante criar a máscara e adicionar no componente para facilitar a vida do usuário.

É isto aí pessoal. Qualquer problema avisem.

[]s,

3 comentários:

Luiz Henrique disse...

cara... perfeito...

exatamente o que eu precisava...

mto bom o seu blog e esse post entao, nem se fala... abraco!

Unknown disse...

por que criar um próprio? Qual o problema com ConvertNumber (c/ type="current") ?

Samuel Martins Delfim disse...

Danilo,

Se esta componente já te atende, não tem problema você usar ela. No momento que o componente foi feito os componentes padrões não faziam bem a conversão com separadores de milhar e decimais internacionalizados. Este foi a motivação do componente.

Mas como disse, se o ConvertNumber resolve, não tem nenhum problema em usá-lo.

[]s,
Samuel