namespace {
+using number::impl::DecNum;
+
+decNumber UnitConverter::convert(double quantity, UErrorCode status) {
+ DecNum result;
+ result.setTo(quantity, status);
+
+ result.multiplyBy(this->conversion_rate_.factorNum, status);
+ result.divideBy(this->conversion_rate_.factorDen, status);
+
+ if (conversion_rate_.reciprocal) {
+ DecNum reciprocalResult;
+ reciprocalResult.setTo(1, status);
+ reciprocalResult.divideBy(result, status);
+
+ return *(reciprocalResult.getRawDecNumber());
+ }
+
+ return *(result.getRawDecNumber());
+}
+
//////////////////////////
/// BEGIN DATA LOADING ///
//////////////////////////
int8_t constants[CONSTANTS_COUNT] = {};
};
+/**
+ * Represents the conversion rate between `source` and `destincation`.
+ */
struct ConversionRate {
StringPiece source;
StringPiece target;
- Factor factor;
+ number::impl::DecNum factorNum;
+ number::impl::DecNum factorDen;
bool reciprocal;
};
*/
class UnitConverter {
public:
- /*
+ /**
* Constructor for `UnitConverter`.
* NOTE:
* - source and target must be under the same category
*/
UnitConverter(MeasureUnit source, MeasureUnit target, UErrorCode status);
- icu::Measure convert(icu::Measure quantity, UErrorCode status);
+ /**
+ * Convert quantity in the source unit to the corresponding quantity in the target unit.
+ */
+ decNumber convert(double quantity, UErrorCode status);
private:
ConversionRate conversion_rate_;