Dúvidas para converter ponto em virgula em valor monetário.
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
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
Curtidas 0
Respostas
Marcelo Senaga
20/06/2013
Os valores do produto são obtidos como?
GOSTEI 0
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.
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
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.
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
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);
}
}
}
@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
20/06/2013
Conseguiu resolver?
GOSTEI 0