2017-12-04 11 views
1

2つのパラメータを取るメソッドを作成したいと思います。最初の値は金額(String)で、2番目の値は丸めタイプに基づく丸めタイプです。それは、エラー小数が見つからない示した値を切り上げたり切り捨てたりように...BigDecimalの丸め値

public static String roundingAmount(String amount, String mode) { 
    if (amount != null) { 
     double dAmt = Double.parseDouble(amount); 
     if (mode.equalsIgnoreCase("Rounded")) 
      BigDecimal decimal = new BigDecimal(dAmt).setScale(0, RoundingMode.HALF_UP); 
     else if (mode.equalsIgnoreCase("Round UP")) 
      BigDecimal decimal = new BigDecimal(dAmt).setScale(0, RoundingMode.CEILING); 
     else if (mode.equalsIgnoreCase("Round Down")) 
      BigDecimal decimal = new BigDecimal(dAmt).setScale(0, RoundingMode.FLOOR); 
     else if (mode.equalsIgnoreCase("NA")) { 
      return amount; 
     } 
     String newNumber = String.format("%.2f", decimal.doubleValue()); 
     return newNumber; 
    } 
    return amount; 
} 

必要があります。 私を助けることができますか?

+0

どのラインでエラーが発生しましたか? –

+0

行番号14 –

+0

ファンクションブラケットが次のように開始するときに、小数点を宣言して初期化しようとします。 BigDecimal decimal = 0; –

答えて

0

decimalは、それぞれのifブランチの内部でのみ定義されているため、範囲外です。また、あなたにいくつかのコードの重複を救うかもしれない、これらのブロックの外にそれを宣言することができます:

public static String roundingAmount(String amount,String mode){ 
    if(amount != null){ 
     double dAmt = Double.parseDouble(amount); 
     BigDecimal decimal = new BigDecimal(dAmt); // Here! 

     if (mode.equalsIgnoreCase("Rounded")) 
      decimal = decimal.setScale(0, RoundingMode.HALF_UP); 
     else if (mode.equalsIgnoreCase("Round UP")) 
      decimal = decimal.setScale(0, RoundingMode.CEILING); 
     else if(mode.equalsIgnoreCase("Round Down")) 
      decimal = decimal.setScale(0, RoundingMode.FLOOR); 
     else if(mode.equalsIgnoreCase("NA")) { 
      return amount; 
     } 
     String newNumber = String.format("%.2f" , decimal.doubleValue()); 
     return newNumber; 
    } 
    return amount; 
} 
0

DRY原則(自分を繰り返してはいけない)とAlokの答え拡大:するために

public static String roundingAmount(String amount,String mode){ 
    RoundingMode roundingMode; 
    if(amount!=null){ 
     if(mode.equalsIgnoreCase("Rounded")) 
      roundingMode = RoundingMode.HALF_UP; 
     else if(mode.equalsIgnoreCase("Round UP")) 
      roundingMode = RoundingMode.CEILING; 
     else if(mode.equalsIgnoreCase("Round Down")) 
      roundingMode = RoundingMode.FLOOR; 
     else if(mode.equalsIgnoreCase("NA")) 
      return amount; 
     else 
      throw new IllegalArgumentException(mode + " is not an accepted mode"); 

     double dAmt=Double.parseDouble(amount); 
     BigDecimal decimal = new BigDecimal(dAmt).setScale(0, roudingMode); 
     String newNumber = String.format("%.2f" , decimal.doubleValue()); 
     return newNumber; 
    } 
    return amount; 
} 

をコードを直接入力する代わりに、RoundingMode列挙型をメソッドに直接渡すことをお勧めします。これにより、マルチプル・ストリング比較の代わりにswitch文を使用することもできます