diff options
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | doc/cxx/serializer/guide/index.xhtml | 2 | ||||
-rw-r--r-- | libxsde/xsde/cxx/serializer/validating/decimal.cxx | 10 | ||||
-rw-r--r-- | libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx | 5 | ||||
-rw-r--r-- | libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx | 9 | ||||
-rw-r--r-- | tests/cxx/hybrid/facets/driver.cxx | 6 | ||||
-rw-r--r-- | tests/cxx/hybrid/facets/test-000.std | 2 | ||||
-rw-r--r-- | tests/cxx/hybrid/facets/test-000.xml | 1 | ||||
-rw-r--r-- | tests/cxx/hybrid/facets/test.xsd | 1 | ||||
-rw-r--r-- | xsde/cxx/serializer/serializer-inline.cxx | 15 |
10 files changed, 49 insertions, 4 deletions
@@ -9,6 +9,8 @@ Version 3.3.0 C++/Serializer + * Support for the fractionDigits facet for the decimal data type. + * New functions, format() and precision(), allow changing of the output notation and precision for the float, double, and decimal type serializers. diff --git a/doc/cxx/serializer/guide/index.xhtml b/doc/cxx/serializer/guide/index.xhtml index 43de074..2a03c4c 100644 --- a/doc/cxx/serializer/guide/index.xhtml +++ b/doc/cxx/serializer/guide/index.xhtml @@ -6481,6 +6481,8 @@ private: <tr><td>maxExclusive</td><td>Integer and floating-point types.</td></tr> <tr><td>maxInclusive</td><td>Integer and floating-point types.</td></tr> + <tr><td>fractionDigits</td><td><code>decimal</code></td></tr> + <tr><th colspan="2">Datatypes</th></tr> <tr><td>byte</td><td></td></tr> diff --git a/libxsde/xsde/cxx/serializer/validating/decimal.cxx b/libxsde/xsde/cxx/serializer/validating/decimal.cxx index d4408af..a01cbc2 100644 --- a/libxsde/xsde/cxx/serializer/validating/decimal.cxx +++ b/libxsde/xsde/cxx/serializer/validating/decimal.cxx @@ -45,12 +45,14 @@ namespace xsde // char str[128]; + unsigned int p (f.fraction_digits_set_ + ? f.fraction_digits_ + : precision_); + #ifdef XSDE_SNPRINTF - int n = snprintf (str, 128, "%.*f", - static_cast<int> (precision_), value_); + int n = snprintf (str, 128, "%.*f", static_cast<int> (p), value_); #else - int n = sprintf (str, "%.*f", - static_cast<int> (precision_), value_); + int n = sprintf (str, "%.*f", static_cast<int> (p), value_); #endif if (n > 0 && n < 128) { diff --git a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx index b757ca9..a11693a 100644 --- a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx +++ b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx @@ -980,16 +980,21 @@ namespace xsde void _min_facet (double, bool inclusive); + void + _fraction_digits_facet (unsigned int); + protected: struct facets { double min_; double max_; + unsigned int fraction_digits_; unsigned int min_set_ : 1; unsigned int min_inc_ : 1; unsigned int max_set_ : 1; unsigned int max_inc_ : 1; + unsigned int fraction_digits_set_ : 1; }; const facets& diff --git a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx index 1798404..c8289d9 100644 --- a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx +++ b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx @@ -817,6 +817,7 @@ namespace xsde #endif facets_.min_set_ = 0; facets_.max_set_ = 0; + facets_.fraction_digits_set_ = 0; } #ifdef XSDE_REUSE_STYLE_TIEIN @@ -826,6 +827,7 @@ namespace xsde { facets_.min_set_ = 0; facets_.max_set_ = 0; + facets_.fraction_digits_set_ = 0; } #endif inline void decimal_sskel:: @@ -844,6 +846,13 @@ namespace xsde facets_.min_inc_ = inc; } + inline void decimal_sskel:: + _fraction_digits_facet (unsigned int v) + { + facets_.fraction_digits_ = v; + facets_.fraction_digits_set_ = 1; + } + inline const decimal_sskel::facets& decimal_sskel:: _facets () const { diff --git a/tests/cxx/hybrid/facets/driver.cxx b/tests/cxx/hybrid/facets/driver.cxx index 9bdfec4..bb2f258 100644 --- a/tests/cxx/hybrid/facets/driver.cxx +++ b/tests/cxx/hybrid/facets/driver.cxx @@ -36,6 +36,12 @@ main (int argc, char* argv[]) doc_p.parse (argv[1]); type* r = root_p.post (); + // Test fractionDigit. + // + decimal d; + d.base_value (50.123); + r->decimal ().push_back (d); + // Serialize. // root_saggr root_s; diff --git a/tests/cxx/hybrid/facets/test-000.std b/tests/cxx/hybrid/facets/test-000.std index e777433..3f94b6c 100644 --- a/tests/cxx/hybrid/facets/test-000.std +++ b/tests/cxx/hybrid/facets/test-000.std @@ -47,6 +47,8 @@ <decimal>10.5</decimal> <decimal>50</decimal> <decimal>99.5</decimal> + <decimal>99.55</decimal> + <decimal>50.12</decimal> <string1>12345</string1> <string2>12345</string2> <string2>1234567</string2> diff --git a/tests/cxx/hybrid/facets/test-000.xml b/tests/cxx/hybrid/facets/test-000.xml index 814be66..6430ff1 100644 --- a/tests/cxx/hybrid/facets/test-000.xml +++ b/tests/cxx/hybrid/facets/test-000.xml @@ -63,6 +63,7 @@ <decimal>10.5</decimal> <decimal>50.0</decimal> <decimal>99.5</decimal> + <decimal>99.55</decimal> <string1>12345</string1> diff --git a/tests/cxx/hybrid/facets/test.xsd b/tests/cxx/hybrid/facets/test.xsd index 86c9776..7a45dfe 100644 --- a/tests/cxx/hybrid/facets/test.xsd +++ b/tests/cxx/hybrid/facets/test.xsd @@ -110,6 +110,7 @@ <restriction base="decimal"> <minInclusive value="10.0"/> <maxInclusive value="100"/> + <fractionDigits value="2"/> </restriction> </simpleType> diff --git a/xsde/cxx/serializer/serializer-inline.cxx b/xsde/cxx/serializer/serializer-inline.cxx index 1545c4a..e35e0f3 100644 --- a/xsde/cxx/serializer/serializer-inline.cxx +++ b/xsde/cxx/serializer/serializer-inline.cxx @@ -98,6 +98,21 @@ namespace CXX } } } + + if (ub.is_a<SemanticGraph::Fundamental::Decimal> ()) + { + for (Restricts::FacetIterator i (r.facet_begin ()); + i != r.facet_end (); ++i) + { + if (!ctx.validation) + continue; + + if (i->first == L"fractionDigits") + { + os << "this->_fraction_digits_facet (" << i->second << ");"; + } + } + } } struct Enumeration: Traversal::Enumeration, Context |