@cond Doxygen_Suppress
| 4674 | |
| 4675 | //! @cond Doxygen_Suppress |
| 4676 | static double normalizeMeasure(const std::string &uom_code, |
| 4677 | const std::string &value, |
| 4678 | std::string &normalized_uom_code) { |
| 4679 | if (uom_code == "9110") // DDD.MMSSsss..... |
| 4680 | { |
| 4681 | double normalized_value = c_locale_stod(value); |
| 4682 | std::ostringstream buffer; |
| 4683 | buffer.imbue(std::locale::classic()); |
| 4684 | constexpr size_t precision = 12; |
| 4685 | buffer << std::fixed << std::setprecision(precision) |
| 4686 | << normalized_value; |
| 4687 | auto formatted = buffer.str(); |
| 4688 | size_t dotPos = formatted.find('.'); |
| 4689 | assert(dotPos + 1 + precision == formatted.size()); |
| 4690 | auto minutes = formatted.substr(dotPos + 1, 2); |
| 4691 | auto seconds = formatted.substr(dotPos + 3); |
| 4692 | assert(seconds.size() == precision - 2); |
| 4693 | normalized_value = |
| 4694 | (normalized_value < 0 ? -1.0 : 1.0) * |
| 4695 | (std::floor(std::fabs(normalized_value)) + |
| 4696 | c_locale_stod(minutes) / 60. + |
| 4697 | (c_locale_stod(seconds) / std::pow(10, seconds.size() - 2)) / |
| 4698 | 3600.); |
| 4699 | normalized_uom_code = common::UnitOfMeasure::DEGREE.code(); |
| 4700 | /* coverity[overflow_sink] */ |
| 4701 | return normalized_value; |
| 4702 | } else { |
| 4703 | normalized_uom_code = uom_code; |
| 4704 | return c_locale_stod(value); |
| 4705 | } |
| 4706 | } |
| 4707 | //! @endcond |
| 4708 | |
| 4709 | // --------------------------------------------------------------------------- |
no test coverage detected