xtd 0.2.0
__numeric_formatter.hpp
Go to the documentation of this file.
1
3#pragma once
5#if !defined(__XTD_CORE_INTERNAL__)
6#error "Do not include this file: Internal use only"
7#endif
9
12#include "__sprintf.hpp"
13#include <algorithm>
14
16template<class char_t, class value_t>
17inline std::basic_string<char_t> __numeric_formatter(const std::basic_string<char_t>& fmt, value_t value, const std::locale& loc) {
18 auto format = fmt;
19 if (format.empty()) format = {'G'};
20
21 std::vector<char_t> possible_formats {'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'n', 'N', 'o', 'O', 'p', 'P', 'x', 'X'};
22 if (format.size() > 3 || std::find(possible_formats.begin(), possible_formats.end(), format[0]) == possible_formats.end() || (format.size() >= 2 && !std::isdigit(format[1])) || (format.size() == 3 && !std::isdigit(format[2])))
24
25 int precision = 0;
26 if (format[0] == 'b' || format[0] == 'B' || format[0] == 'd' || format[0] == 'D' || format[0] == 'o' || format[0] == 'O' || format[0] == 'x' || format[0] == 'X') {
27 try {
28 for (auto c : format.substr(1))
29 if (!std::isdigit(c) && c != ' ' && c != '+' && c != '-') xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::format, "Invalid format expression");
30 if (format.size() > 1) precision = std::stoi(format.substr(1));
31 } catch (...) {
33 }
34 if ((format[0] == 'd' || format[0] == 'D') && precision > 0 && value < 0) precision += 1;
35 if ((format[0] == 'd' || format[0] == 'D') && precision < 0 && value < 0) precision -= 1;
36 }
37
38 std::basic_string<char_t> fmt_str({'%', '0', '*', 'l', 'l'});
39 switch (format[0]) {
40 case 'b':
41 case 'B': return __binary_formatter<char_t>(value, precision);
42 case 'd':
43 case 'D':
44 case 'G': return __sprintf((fmt_str + char_t(std::is_unsigned<value_t>::value ? 'u' : 'd')).c_str(), precision, static_cast<long long>(value));
45 case 'o':
46 case 'O': return __sprintf((fmt_str + char_t('o')).c_str(), precision, static_cast<long long>(value));
47 case 'x':
48 case 'X': return __sprintf((fmt_str + format[0]).c_str(), precision, static_cast<long long>(value));
49 default: return __floating_point_formatter(format, static_cast<long double>(value), loc);
50 }
51}
Contains __binary_formatter method.
Contains __floating_point_formatter method.
Contains __format method.
size_type size() const noexcept
Returns the number of char_t elements in the string, i.e. std::distance(begin(), end()).
Definition basic_string.hpp:926
bool empty() const noexcept
Checks if the string has no characters, i.e. whether begin() == end().
Definition basic_string.hpp:896
basic_string substr() const
Returns a substring [pos, pos + count). If the requested substring extends past the end of the string...
Definition basic_string.hpp:1838
static void throws(xtd::helpers::exception_case exception_case, const source_location &location=source_location::current())
Throws an exption with specified exception case.
xtd::string format(const xtd::string &fmt, args_t &&... args)
Writes the text representation of the specified arguments list, to string using the specified format ...
Definition format.hpp:20
exception_case
Represents the exception case used by the xtd::helpers::exception helper class.
Definition exception_case.hpp:25
@ format
The format is not valid.
@ c
The C key.
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition xtd_about_box.hpp:10