Alguem pode me dar uma dica ?

Produto p = new Produto() ; 
ProdutoDAO dao = new ProdutoDAO();
p.setDescricao(txtDesc.getText());
p.setQtd(Integer.parseInt(txtQtd.getText()));
p.setPreco(Double.parseDouble(txtPreco.getText())); 
dao.create(p);

Estou criando uma interface e mandando os valores para o banco de Dados , mas quando o usuário utiliza Virgula no lugar de ponto meu programa da erro , como eu faço para que ele aceite virgula e ponto no campo preço ? . Desde já obrigado .

Vc precisa definir o Locale adequado e parsear o texto com outro objeto. o Double só sabe coisas com . pois é o padrão java ( independe do locale )

Use java.text.NumberFormat ( http://docs.oracle.com/javase/6/docs/api/java/text/NumberFormat.html ):

ex:

NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
Number number = format.parse("1,234");
double d = number.doubleValue();

Dito isso, vc precisa pensar no seguinte: um preço É Double?

vc realmente tem um valor de ponto flutuante de dupla precisão? tipo 0.000000000001 ? pode ser negativo?

as vezes o preço é um multiplo de centavos. Vc em algum momento pode precisar de um objeto mais adequado ( uma classe Money, não sei pq java não tem isso ).

dinheiro é um exemplo de quantidade de ponto fixo, onde vc tem duas ou tres casas decimais. vc pode fazer uma aproximação e salvar um valor inteiro que corresponda aos centavos.

agora de forma alguma vc pode usar double ( ou float ) em dinhero no mundo real (ou, pelo menos, em sistemas de contabilidade). os problemas de arredondamento inerentes ao ponto flutuante pode trazer inconsistencias importantes.

Sou novo no site e nem sei como agradecer , obrigado pela ajuda ! .

Sempre ouvi que o melhor é usar a BigDecimal pra moeda, mas nunca entendi ao certo o porque . Saberia me dizer, @peczenyj?

Vamos la

BigDecimal por si tem varias vantagens em relação aos tipos numericos primitivos porém a performance é ligeiramente menor. Vc só deve se preocupar com isso no caso de vc estar efetuando algo como algum calculo numerico onde vc faz muitas operações ( e olhe lá ).

http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

Uma das vantagens é que vc pode setar uma escala (scale), ou seja dizer quantos “digitos” vc vai ter.

Mas dinheiro não é apenas um valor. Vc tem o tipo de moeda (Currency) e outras coisas.

Aqui vai um exemplo de implementação de classe Money que usa BigDecimal E Currency ( no caso vai trabalhar em Dolar )

public class Money {

    private static final Currency USD = Currency.getInstance("USD");
    private static final RoundingMode DEFAULT_ROUNDING = RoundingMode.HALF_EVEN;

    private BigDecimal amount;
    private Currency currency;   

    public static Money dollars(BigDecimal amount) {
        return new Money(amount, USD);
    }

    Money(BigDecimal amount, Currency currency) {
        this(amount, currency, DEFAULT_ROUNDING);
    }

    Money(BigDecimal amount, Currency currency, RoundingMode rounding) {
        this.amount = amount;
        this.currency = currency;

        this.amount = amount.setScale(currency.getDefaultFractionDigits(), rounding);
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public Currency getCurrency() {
        return currency;
    }

    @Override
    public String toString() {
        return getCurrency().getSymbol() + " " + getAmount();
    }

    public String toString(Locale locale) {
        return getCurrency().getSymbol(locale) + " " + getAmount();
    }   
}

O problema que vc descreveu é de precisao, por isso a classe BigDecimal.

Não sei qual problema uma classe Money resolveria, teria que ser um problema comum pra ser incluído na biblioteca padrão.

fazer a composição com a moeda e imprimir bonitinho R$ 1.000,00 ?

Mas tem, tem o Money API, que um dos colaboradores (ou lider, nao sei) é o brasileiro Otavio Santana, colaborador aqui do guj e palestrante

1 curtida

O que vc quer dizer com “composição com a moeda”?

Como vc formata um número pra apresentação depende da cultura da região, e não da moeda. Por isso usa-se NumberFormat em conjunto com Locale.

Já ia cita-la.

https://otaviojava.gitbooks.io/money-api/content/pt-br/index.html