diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/xmlpatterns/schema/qxsdtypechecker.cpp | 13 | ||||
-rw-r--r-- | tests/auto/xmlpatternsvalidator/files/fractiondigits.xml | 4 | ||||
-rw-r--r-- | tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd | 15 | ||||
-rw-r--r-- | tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp | 5 |
5 files changed, 32 insertions, 7 deletions
diff --git a/.qmake.conf b/.qmake.conf index ae17d7b..63235ed 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -2,4 +2,4 @@ load(qt_build_config) CONFIG += warning_clean DEFINES += QT_NO_FOREACH -MODULE_VERSION = 5.8.0 +MODULE_VERSION = 5.8.1 diff --git a/src/xmlpatterns/schema/qxsdtypechecker.cpp b/src/xmlpatterns/schema/qxsdtypechecker.cpp index 2e4ce8e..d6b224f 100644 --- a/src/xmlpatterns/schema/qxsdtypechecker.cpp +++ b/src/xmlpatterns/schema/qxsdtypechecker.cpp @@ -37,6 +37,8 @@ ** ****************************************************************************/ +#include <QtMath> + #include "qxsdtypechecker_p.h" #include "qabstractdatetime_p.h" @@ -150,13 +152,12 @@ static int fractionDigitsForDecimal(const QString &lexicalValue) { // we use the lexical value here, as the conversion to double might strip // away decimal positions - - QString trimmedValue(lexicalValue.trimmed()); - const int pos = trimmedValue.indexOf(QLatin1Char('.')); - if (pos == -1) // no '.' -> 0 fraction digits + bool ok = false; + double dbl = lexicalValue.toDouble(&ok); + if (!ok) return 0; - else - return (trimmedValue.length() - pos - 1); + dbl = dbl - qFloor(dbl); + return QString::number(dbl).length() - 2; } XsdTypeChecker::XsdTypeChecker(const XsdSchemaContext::Ptr &context, const QVector<QXmlName> &namespaceBindings, const QSourceLocation &location) diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml new file mode 100644 index 0000000..55c2ee8 --- /dev/null +++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<tns:number xmlns:tns="http://www.example.org/FractionDigitsTest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/FractionDigitsTest FractionDigitsTest.xsd"> + <tns:value>1234.560000</tns:value> +</tns:number> diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd new file mode 100644 index 0000000..b8f266a --- /dev/null +++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/FractionDigitsTest" xmlns:tns="http://www.example.org/FractionDigitsTest" elementFormDefault="qualified"> + <element name="number" type="tns:NumberType" /> + <complexType name="NumberType"> + <sequence> + <element name="value"> + <simpleType> + <restriction base="decimal"> + <fractionDigits value="2"/> + </restriction> + </simpleType> + </element> + </sequence> + </complexType> +</schema> diff --git a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp index 8e86dd9..8a11418 100644 --- a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp +++ b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp @@ -227,6 +227,11 @@ void tst_XmlPatternsValidator::xsdSupport_data() const << (QStringList() << path + QLatin1String("substitution-group-invalid.xml") << path + QLatin1String("substitution-group.xsd")) << QString(); + QTest::newRow("QTBUG-58245 fraction digits shouldn't take trailing 0 into account") + << 0 + << (QStringList() << path + QLatin1String("fractiondigits.xml") + << path + QLatin1String("fractiondigits.xsd")) + << QString(); } QTEST_MAIN(tst_XmlPatternsValidator) |