Dúvidas para converter ponto em virgula em valor monetário.

Java

20/06/2013

Bom dia Pessoal.

Tenho um pequeno problema

Estou desenvolvendo uma pequena aplicação Com Spring MVC, taglib e JSP, na mesma possui uma classe modelo com um atributo Valor. Quando eu insiro um valor no meu BD (MySql) usando virgula, o mesmo da apresenta o seguinte problema: Quando coloco ponto, o mesmo é aceito normalmente, quando coloco vírgula, o mesmo aparece zerado.

Na classe modelo Produto, coloquei um annotation para converter ponto em vírgula (@NumberFormat(style = Style.NUMBER, pattern = "#,###.###")), porém ao inserir o mesmo no banco, o mesmo converte ponto em virgula porém se tentarmos cadastrar com ponto o mesmo apresenta o seguinte problema:

28 Banana 1500 R$ 150,00 Com ponto

o valor cadastrado com ponto foi 1.50 e o mesmo foi salvo como 150,00

Se eu colocar uma tag taglib fmt para valor monetário (<fmt:formatNumber value="${produto.valor}" type="currency"/>), o mesmo segu8e o mesmo padrão descrito acima.

Alguém saberia como eu faço para caso um usuário qualquer tente colocar ponto, o mesmo cadastre corretamente ou informe ao usuário para colocar virgula?


public class Produto {

private long id;
private String nome;
private int quantidade;
@NumberFormat(style = Style.NUMBER, pattern = "#,###.###")
private double valor;
private String descricao;
private Date dataDeAtualizacao;


Meu formulário

</head>
<body>

<c:import url="/WEB-INF/views/menu/menu.jsp" />

<h1 align="center">Lista de Produtos</h1>

<table border="1" align="center">
<tr align="center">
<th>Id</th>
<th>Nome</th>
<th>Quantidade</th>
<th>Valor</th>
<th>Descrição</th>
<th>Data de Atualização</th>
<th>Remover</th>
<th>Atualizar</th>
<th>Alterar</th>
</tr>
<c:forEach items="$" var="produto">

<tr>
<td align="center">${produto.id}</td>
<td>${produto.nome}</td>
<td align="center">${produto.quantidade}</td>
<td align="center"><fmt:formatNumber value="${produto.valor}" type="currency"/> </td>
<td align="center">${produto.descricao}</td>
<td align="center"><fmt:formatDate value="${produto.dataDeAtualizacao}" pattern="dd/MM/yyyy"/> </td>
<td><a href="removeProduto?id=${produto.id}">Remover</a> </td>
<td><a href="atualizaProduto?id=${produto.id}">Atualizar</a> </td>
<td><a href="alteraProduto?id=${produto.id}">Alterar</a>

</tr>

</c:forEach>
</table>

Lista Impressa:


Id

Nome

Quantidade

Valor

Descrição

Data de Atualização

Remover

Atualizar

Alterar

ID / PRODUTO /Quantidade /VALOR /DESCRIçÃO /DATA ATUALIZAÇÃO
27 / Acucar / 1000 / R$ 1,50 / Com vírgula /20/06/2013
28 /Banana /1500 /R$ 150,00 / Com ponto /20/06/2013
31 /Açúcar /100 /R$ 1,50 /Annotation com ponto /20/06/2013
32 /Alexsandro / 1000 /R$ 0,00 /Annotation com virgula /20/06/2013
33 /Aveia /10 R$ /1,50 /Annotation e taglib com virgula/20/06/2013
34 /Farinha de Trigo / 100 /R$ 150,00 / Annotation e taglib com ponto /20/06/2013
Alexsandro Farias

Alexsandro Farias

Curtidas 0

Respostas

Marcelo Senaga

Marcelo Senaga

20/06/2013

Os valores do produto são obtidos como?
GOSTEI 0
Alexsandro Farias

Alexsandro Farias

20/06/2013

Os valores o usuário digita através de um formulário JSP.

Segue:

</head>

<body>

<c:import url="/WEB-INF/views/menu/menu.jsp" />

<h1 align="center">Tela de Cadastro de Produtos</h1>
<br>

<form:errors path="produto.adicionado.nome" />
<form action="cadastroDeProduto" method="post">

<table align="center">
<tr>
<td>Nome:</td><td colspan="3"> <input type="text" size="58" name="nome"></td>
</tr>
<tr>
<td>Quantidade:</td><td> <input type="text" size="10" name="quantidade"></td>
<td>Valor:</td><td><input type="text" size="35" name="valor">
</td>
</tr>
<tr>
<td>Descrição do Produto:</td><td colspan="3"> <textarea rows="3"
cols="43" name="descricao"></textarea>
</td>
</tr>
<tr align="right">
<td colspan="4"><input type="submit" value="Cadastrar Produto">
</td>
</tr>

</table>
<c:import url="/WEB-INF/views/menu/rodape.jsp" />
</form>
</body>
</html>

Então. Com certeza o usuário qualquer irá colocar virgula ao digitar o valor, porem consegui resolver esse problema convertendo ponto para virgula, porem minha preocupação é de que o usuário coloque ponto.
GOSTEI 0
Marcelo Senaga

Marcelo Senaga

20/06/2013

1) Você poderia colocar um validador Javascript para impedir que o usuário submeta um ponto. (lado cliente)
2) Você poderia colocar um validador no lado do servidor
3) Detectar se veio ponto, e substituir por vírgula antes de enviar ao banco.

Poste o código onde você recebe os dados do formulário.
GOSTEI 0
Alexsandro Farias

Alexsandro Farias

20/06/2013

Segue minha classe Produto Controller.

@Controller
public class ProdutoController {

@RequestMapping("novoProduto")
public String novo() {
return "produto/cadastro_produto";
}

@RequestMapping("cadastroDeProduto")
public String cadastroProduto(@Valid Produto produto, BindingResult result) {
ProdutoDAO dao = new ProdutoDAO();
dao.adicionarProduto(produto);
JOptionPane.showMessageDialog(null, "Produto Cadastrado com Sucesso!");
return "redirect:listaProduto";
}

@RequestMapping("listaProduto")
public String listaDeProdutos(Model model) {
ProdutoDAO dao = new ProdutoDAO();
model.addAttribute("produtos", dao.listaDeProdutos());
return "produto/lista_produto";
}

@RequestMapping("removeProduto")
public String removeProduto(Produto produto) {
if (JOptionPane.showConfirmDialog(null, "Deseja mesmo Remover?",
"Remover Produto", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
ProdutoDAO dao = new ProdutoDAO();
dao.removeProduto(produto);
} else {
return "redirect:listaProduto";
}
return "redirect:listaProduto";
}

// Abre a página de atualização de produtos passando o ID a ser atualizado
@RequestMapping("entradaDeProduto")
public String entradaDeProduto(Long id, Model model) {
ProdutoDAO dao = new ProdutoDAO();
model.addAttribute("produto", dao.buscaPorId(id));
return "produto/entrada_produto";
}

// Atualiza o produto selecionado
@RequestMapping("entradaProduto")
public String entradaProduto(Produto produto) {
ProdutoDAO dao = new ProdutoDAO();
dao.entradaProduto(produto);
JOptionPane.showMessageDialog(null, "Produto Atualizado com sucesso!");
return "redirect:listaProduto";
}

// Abre página de alteração de produto passando ID
@RequestMapping("alteraProduto")
public String alteraProduto(Long id, Model model) {
ProdutoDAO dao = new ProdutoDAO();
model.addAttribute("produto", dao.buscaPorId(id));
return "produto/altera_produto";
}

// Altera o produto selecionado.
@RequestMapping("alterarProduto")
public String alterarProduto(Produto produto) {
ProdutoDAO dao = new ProdutoDAO();
dao.alteraProduto(produto);
JOptionPane.showMessageDialog(null, "Produto Alterado com sucesso!");
return "redirect:listaProduto";
}
}

Segue o ProdutoDAO

public class ProdutoDAO {

private Connection connection;

public ProdutoDAO() {
this.connection = new ConnectionFactory().getConnection();
}

public void adicionarProduto(Produto produto) {

String sql = "insert into produto "
+ "(nome, quantidade, valor, descricao, datadeatualizacao)"
+ "values (?,?,?,?,?)";

try {
PreparedStatement stmt = connection.prepareStatement(sql);

stmt.setString(1, produto.getNome());
stmt.setInt(2, produto.getQuantidade());
stmt.setDouble(3, produto.getValor());
stmt.setString(4, produto.getDescricao());
stmt.setDate(5, new Date(Calendar.getInstance().getTimeInMillis()));

stmt.execute();
stmt.close();

connection.close();

} catch (SQLException e) {
throw new RuntimeException(e);
}
}

public List<Produto> listaDeProdutos() {
try {

List<Produto> produtos = new ArrayList<Produto>();
PreparedStatement stmt = this.connection
.prepareStatement("select * from produto");

ResultSet rs = stmt.executeQuery();

while (rs.next()) {
produtos.add(populaProduto(rs));
}

rs.close();
stmt.close();

return produtos;

} catch (SQLException e) {
throw new RuntimeException(e);
}
}

private Produto populaProduto(ResultSet rs) throws SQLException {

Produto produto = new Produto();

produto.setId(rs.getLong("id"));
produto.setNome(rs.getString("nome"));
produto.setQuantidade(rs.getInt("quantidade"));
produto.setValor(rs.getDouble("valor"));
produto.setDescricao(rs.getString("descricao"));
produto.setDataAtualizacao(rs.getDate("datadeatualizacao"));

return produto;
}

public void removeProduto(Produto produto) {
/*
* if (produto.getId() == null){ throw new
* IllegalStateException("ID do produto não encontrado");
* JOptionPane.showConfirmDialog(null, "Id não existe!"); }
*/
String sql = "delete from produto where id = ?";

try {

PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setLong(1, produto.getId());
stmt.execute();

} catch (SQLException e) {
throw new RuntimeException(e);
}
}

public Produto buscaPorId(Long id) {

if (id == null) {
throw new IllegalStateException("Id do produto não deve ser nulo");
}

try {
PreparedStatement stmt = this.connection
.prepareStatement("select * from produto where id = ?");
stmt.setLong(1, id);

ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return populaProduto(rs);
}

rs.close();
stmt.close();

return null;

} catch (SQLException e) {
throw new RuntimeException(e);
}
}

public void entradaProduto(Produto produto) {

String sql = "update produto set quantidade = quantidade + ?, dataDeAtualizacao = ? where id = ?";

PreparedStatement stmt;
try {

stmt = connection.prepareStatement(sql);

stmt.setInt(1, produto.getQuantidade());
stmt.setDate(2, new Date(Calendar.getInstance().getTimeInMillis()));
stmt.setLong(3, produto.getId());
stmt.execute();

} catch (SQLException e) {
throw new RuntimeException(e);
}
}

public void alteraProduto(Produto produto) {

String sql = "update produto set nome = ?,"
+ "quantidade = ?, valor = ?, descricao = ?, dataDeAtualizacao = ? where id = ?";

PreparedStatement stmt;
try {

stmt = connection.prepareStatement(sql);

stmt.setString(1, produto.getNome());
stmt.setInt(2, produto.getQuantidade());
stmt.setDouble(3, produto.getValor());
stmt.setString(4, produto.getDescricao());
stmt.setDate(5, new Date(Calendar.getInstance().getTimeInMillis()));
stmt.setLong(6, produto.getId());
stmt.execute();

} catch (SQLException e) {
throw new RuntimeException(e);
}
}

}
GOSTEI 0
Marcelo Senaga

Marcelo Senaga

20/06/2013

Conseguiu resolver?
GOSTEI 0
POSTAR