diff --git a/src/xtd.core/CMakeLists.txt b/src/xtd.core/CMakeLists.txt index 3e88666cbe7..d546af7cdf4 100644 --- a/src/xtd.core/CMakeLists.txt +++ b/src/xtd.core/CMakeLists.txt @@ -675,6 +675,8 @@ add_sources( include/xtd/internal/__format_stringer include/xtd/internal/__hasher.h include/xtd/internal/__hasher + include/xtd/internal/__hexfloat_formatter.h + include/xtd/internal/__hexfloat_formatter include/xtd/internal/__iformatable_formatter.h include/xtd/internal/__iformatable_formatter include/xtd/internal/__natural_formatter.h diff --git a/src/xtd.core/include/xtd/internal/__floating_point_formatter.h b/src/xtd.core/include/xtd/internal/__floating_point_formatter.h index 3c550d889b0..2595b0ddb15 100644 --- a/src/xtd.core/include/xtd/internal/__floating_point_formatter.h +++ b/src/xtd.core/include/xtd/internal/__floating_point_formatter.h @@ -7,9 +7,11 @@ #endif /// @endcond +#include "__binary_formatter.h" #include "__character_formatter.h" #include "__currency_formatter.h" #include "__format_exception.h" +#include "__hexfloat_formatter.h" #include "__natural_formatter.h" #include "__sprintf.h" #include @@ -21,7 +23,7 @@ inline std::basic_string __floating_point_formatter(const std::basic_str auto fmt = format; if (fmt.empty()) fmt = {'G'}; - std::vector possible_formats {'c', 'C', 'e', 'E', 'f', 'F', 'g', 'G', 'n', 'N', 'p', 'P'}; + std::vector possible_formats {'b', 'B', 'c', 'C', 'e', 'E', 'f', 'F', 'g', 'G', 'n', 'N', 'p', 'P', 'x', 'X'}; if (fmt.size() > 3 || std::find(possible_formats.begin(), possible_formats.end(), fmt[0]) == possible_formats.end() || (fmt.size() >= 2 && !std::isdigit(fmt[1])) || (fmt.size() == 3 && !std::isdigit(fmt[2]))) __format_exception("Custom format not yet implemented"); @@ -37,6 +39,8 @@ inline std::basic_string __floating_point_formatter(const std::basic_str std::basic_string fmt_str({'%', '.', '*', 'L'}); switch (fmt[0]) { + case 'b': + case 'B': {long double value_long_double = static_cast(value); int64_t value_int64 = 0; memcpy(&value_int64, &value_long_double, sizeof(value_long_double)); return __binary_formatter(value_int64, precision);} case 'c': case 'C': return __currency_formatter(static_cast(value), loc); case 'e': @@ -49,6 +53,8 @@ inline std::basic_string __floating_point_formatter(const std::basic_str case 'N': return __natural_formatter(static_cast(value), precision, loc); case 'p': return __sprintf((fmt_str + char_t('f')).c_str(), precision, static_cast(value * 100)) + std::basic_string({char_t(' '), char_t('%')}); case 'P': return __sprintf((fmt_str + char_t('F')).c_str(), precision, static_cast(value * 100)) + std::basic_string({char_t(' '), char_t('%')}); + case 'x': + case 'X': return __hexfloat_formatter(static_cast(value), precision, loc); default: __format_exception("Invalid format expression"); return {}; } } diff --git a/src/xtd.core/include/xtd/internal/__hexfloat_formatter b/src/xtd.core/include/xtd/internal/__hexfloat_formatter new file mode 100644 index 00000000000..d2009eb08ae --- /dev/null +++ b/src/xtd.core/include/xtd/internal/__hexfloat_formatter @@ -0,0 +1,2 @@ +#pragma once +#include "__hexfloat_formatter.h" diff --git a/src/xtd.core/include/xtd/internal/__hexfloat_formatter.h b/src/xtd.core/include/xtd/internal/__hexfloat_formatter.h new file mode 100644 index 00000000000..e68b62c2b06 --- /dev/null +++ b/src/xtd.core/include/xtd/internal/__hexfloat_formatter.h @@ -0,0 +1,23 @@ +/// @file +/// @brief Contains __hexfloat_formatter method. +#pragma once +/// @cond +#if !defined(__XTD_CORE_INTERNAL__) +#error "Do not include this file: Internal use only" +#endif +/// @endcond + +#include +#include +#include +#include + +/// @cond +template +inline std::basic_string __hexfloat_formatter(long double value, int precision, const std::locale& loc) { + std::basic_stringstream ss; + ss.imbue(loc); + ss << std::hexfloat << std::setprecision(precision) << value; + return ss.str(); +} +/// @endcond