2015-05-22 16 views
6

Tôi phải tích hợp ứng dụng web của mình với cổng thanh toán. Tôi muốn nhập tổng số tiền bằng USD và sau đó chuyển đổi nó thành Cents làm thư viện cổng thanh toán của tôi chấp nhận số tiền trong Cents (loại Integer). Tôi thấy rằng Big Decimal trong java là cách tốt nhất để thao túng tiền tệ. Hiện nay tôi đưa đầu vào như nói 50 USD và chuyển nó sang Integer như thế này:Cách tốt nhất để chuyển đổi Dollars (Big Decimal) thành Cents (Integer) trong java là gì?

BigDecimal rounded = amount.setScale(2, BigDecimal.ROUND_CEILING); 
BigDecimal bigDecimalInCents = rounded.multiply(new BigDecimal("100.00")); 
Integer amountInCents = bigDecimalInCents.intValue(); 

Đây có phải là cách chính xác chuyển đổi USD để Cents hay tôi nên làm điều đó trong một số cách khác không?

Trả lời

7

Cách đơn giản nhất bao gồm điểm của tôi dưới đây là:

public static int usdToCents(BigDecimal usd) { 
    return usd.movePointRight(2).intValueExact(); 
} 

tôi khuyên bạn nên intValueExact vì điều này sẽ ném một ngoại lệ nếu thông tin sẽ bị mất (trong trường hợp bạn đang xử lý giao dịch trên $ 21,474,836.47). Điều này cũng có thể được sử dụng để bẫy các phân số bị mất.

Tôi cũng muốn xem xét liệu có đúng là chấp nhận giá trị với một phần nhỏ của một xu và tròn hay không. Tôi muốn nói không, mã khách hàng phải cung cấp một lượng thể lập hoá đơn hợp lệ, vì vậy tôi có thể làm điều này nếu tôi cần một ngoại lệ tùy chỉnh cho rằng:

public static int usdToCents(BigDecimal usd) { 
    if (usd.scale() > 2) //more than 2dp 
     thrown new InvalidUsdException(usd);// because was not supplied a billable USD amount 
    BigDecimal bigDecimalInCents = usd.movePointRight(2); 
    int cents = bigDecimalInCents.intValueExact(); 
    return cents; 
} 
+0

cảm ơn @weston vì các đề xuất của bạn! – nikhilahuja

+0

Giải pháp này không thành công cho giá trị âm. Ví dụ, hãy thử -4,56, bạn sẽ nhận được -455. –

+0

@YeshwanthKota đã thử nghiệm nó, đó không phải là trường hợp. Xin hãy giải thích. 'System.out.println (usdToCents (BigDecimal.valueOf (-456, 2))); System.out.println (usdToCents (BigDecimal.valueOf (-4.56))); 'cả hai hiển thị' -4.56' – weston

0

Bạn cũng nên xem xét giảm thiểu Round-off errors.

int amountInCent = (int)(amountInDollar*100 + 0.5); 
LOGGER.debug("Amount in Cents : "+ amountInCent); 

Giải pháp trên đây có thể giúp bạn.

Các vấn đề liên quan