diff options
| author | Carl Hetherington <cth@carlh.net> | 2019-03-12 15:33:40 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2019-03-12 15:33:40 +0000 |
| commit | 670c528a584d96e8bb6009f996204e9ecf174f54 (patch) | |
| tree | b94a78dedd75ed4f62a72740d6c88b1bc948bc69 /src/cxml.cc | |
| parent | fd7e004e0b0a08a9d9b323888c7f60834c93eafc (diff) | |
Remove locked_sstream dependency.
Diffstat (limited to 'src/cxml.cc')
| -rw-r--r-- | src/cxml.cc | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/cxml.cc b/src/cxml.cc index d3ec9e7..82e4bc3 100644 --- a/src/cxml.cc +++ b/src/cxml.cc @@ -300,3 +300,71 @@ cxml::Document::take_root_node () _root_name = _node->get_name (); } } + +static +string +make_local (string v) +{ + struct lconv* lc = localeconv (); + boost::algorithm::replace_all (v, ".", lc->decimal_point); + /* We hope it's ok not to add in thousands separators here */ + return v; +} + +template <typename P, typename Q> +P +locale_convert (Q x) +{ + /* We can't write a generic version of locale_convert; all required + versions must be specialised. + */ + BOOST_STATIC_ASSERT (sizeof(Q) == 0); +} + +template<> +int +locale_convert (string x) +{ + int y = 0; + sscanf (x.c_str(), "%d", &y); + return y; +} + +template<> +float +locale_convert (string x) +{ + float y = 0; + sscanf (x.c_str(), "%f", &y); + return y; +} + +template <> +double +locale_convert (string x) +{ + double y = 0; + sscanf (x.c_str(), "%lf", &y); + return y; +} + +template <> +int +cxml::raw_convert (string v) +{ + return locale_convert<int> (make_local(v)); +} + +template <> +float +cxml::raw_convert (string v) +{ + return locale_convert<float> (make_local(v)); +} + +template <> +double +cxml::raw_convert (string v) +{ + return locale_convert<double> (make_local(v)); +} |
