MCPcopy Create free account
hub / github.com/OSGeo/PROJ / normalizeMeasure

Function normalizeMeasure

src/iso19111/factory.cpp:4676–4706  ·  view source on GitHub ↗

@cond Doxygen_Suppress

Source from the content-addressed store, hash-verified

4674
4675//! @cond Doxygen_Suppress
4676static 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// ---------------------------------------------------------------------------

Callers 3

createPrimeMeridianMethod · 0.85
createConversionMethod · 0.85

Calls 2

c_locale_stodFunction · 0.85
sizeMethod · 0.80

Tested by

no test coverage detected