2015-05-22 35 views
6

Devo integrare la mia applicazione web con un gateway di pagamento. Voglio inserire l'importo totale in USD e quindi convertirlo in Centes come la mia libreria di gateway di pagamento accetta importo in Centesimi (di tipo Integer). Ho trovato che Big Decimal in Java è il modo migliore per la manipolazione della valuta. Attualmente prendo ingresso come dire USD 50 e convertirlo in Integer in questo modo:Qual è il modo migliore per convertire i dollari (Big Decimal) in Cents (Integer) in java?

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

E 'questo il modo corretto di conversione di dollari per centesimi o dovrei farlo in qualche altro modo?

risposta

7

Il più semplice che include i miei punti di seguito è:

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

io consiglierei intValueExact come questo sarà un'eccezione se informazioni andranno perse (nel caso in cui si sta l'elaborazione delle transazioni di cui sopra $ 21,474,836.47). Questo può anche essere usato per intrappolare le frazioni perse.

Vorrei anche considerare se è corretto accettare un valore con una frazione di un centesimo e un giro. Direi di no, il codice del client deve fornire un importo fatturabile valida, quindi potrei fare questo se avevo bisogno di un'eccezione personalizzato per questo:

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

grazie @weston per i vostri suggerimenti! – nikhilahuja

+0

Questa soluzione non riesce per il valore negativo. Ad esempio, prova -4,56, finirai per ottenere -455. –

+0

@YeshwanthKota testato, non è il caso. Si prega di elaborare. 'System.out.println (usdToCents (BigDecimal.valueOf (-456, 2))); System.out.println (usdToCents (BigDecimal.valueOf (-4.56))); 'entrambi mostrano' -4.56' – weston

0

Si dovrebbe anche considerare minimizzando Round-off errors.

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

Questa soluzione potrebbe aiutarti.