2017-06-10 4 views
0

データベースから小数点以下2桁のデータを取得する際に問題があります。 私はresultset.getDouble()メソッドを使用していました。しかし、これは私に結果に小数点以下1桁を与えます。 DecimalFormatを使って2桁に変換しようとしました。私は私のコードを実行すると、私はエラー "文字列をdoubleに変換することはできません" 取得していますDisplayFood.java小数点第2位のデータを取得する

から

DisplayFood.java

Connection connection = null; 
Statement statement = null; 
ResultSet resultset = null; 
DecimalFormat df = new DecimalFormat("#.00"); 

String query = "SELECT * FROM food"; 
statement = connection.createStatement(); 

resultset = statement.executeQuery(query); 

while(resultset.next()) 
{ 
    FoodRecord foodmenu = new FoodRecord(); 
    foodmenu.setItemName(resultset.getString("itemName")); 

    foodmenu.setPrice(df.format(resultset.getDouble("price"))); 
    foodmenu.setRestaurant(resultset.getString("restaurant")); 

    food.add(foodmenu); 
} 

FoodRecord.java

public class FoodRecord { 
    private String itemName; 
    private double price; 
    private String restaurant; 

    public FoodRecord() { 
    } 

    public String getItemName() { 
     return itemName; 
    } 

    public void setItemName(String itemName) { 
     this.itemName = itemName; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public void setPrice(double price) { 
     this.price = price; 
    } 

    public String getRestaurant() { 
     return restaurant; 
    } 

    public void setRestaurant(String restaurant) { 
     this.restaurant = restaurant; 
    } 

} 
+1

これはすべて間違っています。データベースの金額は、DOUBLEではなくDECIMALとして保存する必要があります。小数点以下2桁の「二重」というものはありません。 Javaコードでは 'BigDecimal'を使うべきです。 – EJP

+0

@ルーファン - あなたを助けているユーザーに多大な貢献をしたい。それがこのサイトの仕組みです。 –

答えて

0

あなたはこれを取得エラーbacause doubleフィールドに文字列値を設定しようとしています。 resultset.getDouble("price")を使用して、結果セットから価格を読み取ります。

小数点以下2桁の価格を印刷するには、System.out.printlnのフォーマッタをdf.format(foodMenu.getPrice())のように使用できます。

0

私はresultset.getDouble()メソッドを使用していました。しかし、これは私の結果

getDouble()方法は、二重Javaで表現されている値の数を返すにのみ1 小数点以下を提供します。

getDouble()のJavadoc:

は、Javaプログラミング言語のdoubleとして このResultSetオブジェクトの現在行にある指定された列の値を取得します。

それはあなたの番号の値が10.5であれば、二重の値10.5なく10.50として持っていることを意味します。 Iは2進

DecimalFormat.format(double number)に変換してDecimalFormatを使用してみました

は、特定の形式のStringとしてdoubleをフォーマットします。指定された
形式は、あなたのコードにここにある:これらは互換性のあるタイプではないよう

DecimalFormat df = new DecimalFormat("#.00"); 

だから、そう、あなたがStringDoubleを割り当てることはできません。
問題を解決するには、StringDecimalFormat.format(double number)の結果を格納する必要があります。

しかし、それは確かにpricedoubleフィールドですFoodRecordクラスと一致していないではありません。

:クラスで doubleから Stringpriceを変更 private double price;

は必ずしも二つの理由のために最善の方法ではありません

  • データの視覚的表現はデータ値を変更すべきではありません。 小数点が4の浮動小数点値(たとえば:10.5445)の場合、10.54にフォーマットし、クラス内の情報をStringフィールドとしてのみ格納すると、データ値が切り捨てられます。データベースに値を再度格納すると、オブジェクトがクライアントによって変更されていない間に初期値が変更されます。あなたはStringdoubleを変更するsetPrice()方法でいくつかの計算を行う必要があるとして、あなたはもはや(とても自然な方法で)ダブルで簡単なsetPrice()メソッドを持っていませんでした

あなたの問題を解決するために、あなたがフォーマットされた価格を返す新しい方法を導入でき、:getFormatedPrice()が頻繁に呼び出された場合

public String getFormatedPrice(){ 
    return df.format(resultset.getDouble("price")); 
} 

を、結果はdf.format()を呼び出すのではなく、キャッシュすることができます。

関連する問題