From c3432072927e0f431b5e60e9cd322a48e34392c7 Mon Sep 17 00:00:00 2001 From: speillet Date: Thu, 19 Dec 2019 16:14:58 +0100 Subject: [PATCH 1/5] BUG: scientific notation for double number between 1 and -1, fix #33475 --- src/core/qgsfield.cpp | 25 +++++++++++++++++++++---- tests/src/core/testqgsfield.cpp | 16 ++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/core/qgsfield.cpp b/src/core/qgsfield.cpp index 37f820714413..5eff5570dc01 100644 --- a/src/core/qgsfield.cpp +++ b/src/core/qgsfield.cpp @@ -233,21 +233,38 @@ QString QgsField::displayString( const QVariant &v ) const QString s( v.toString() ); int dotPosition( s.indexOf( '.' ) ); int precision; - if ( dotPosition < 0 ) + if ( dotPosition < 0 && s.indexOf( 'e' ) < 0 ) { precision = 0; + return QLocale().toString( v.toDouble(), 'f', precision ); } else { - precision = s.length() - dotPosition - 1; + if ( dotPosition < 0 ) precision = 0; + else precision = s.length() - dotPosition - 1; + + if ( -1 < v.toDouble() && v.toDouble() < 1 ) + { + return QLocale().toString( v.toDouble(), 'g', precision ); + } + else + { + return QLocale().toString( v.toDouble(), 'f', precision ); + } } - return QLocale().toString( v.toDouble(), 'f', precision ); } } // Default for doubles with precision else if ( d->type == QVariant::Double && d->precision > 0 ) { - return QString::number( v.toDouble(), 'f', d->precision ); + if ( -1 < v.toDouble() && v.toDouble() < 1 ) + { + return QString::number( v.toDouble(), 'g', d->precision ); + } + else + { + return QString::number( v.toDouble(), 'f', d->precision ); + } } } // Other numeric types than doubles diff --git a/tests/src/core/testqgsfield.cpp b/tests/src/core/testqgsfield.cpp index a4d09a454446..be9c4eacdc66 100644 --- a/tests/src/core/testqgsfield.cpp +++ b/tests/src/core/testqgsfield.cpp @@ -358,9 +358,13 @@ void TestQgsField::displayString() //test double value QgsField doubleField( QStringLiteral( "double" ), QVariant::Double, QStringLiteral( "double" ), 10, 3 ); QCOMPARE( doubleField.displayString( 5.005005 ), QString( "5.005" ) ); + QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-09" ) ); + QCOMPARE( doubleField.displayString( 1e-04 ), QString( "0.0001" ) ); QgsField doubleFieldNoPrec( QStringLiteral( "double" ), QVariant::Double, QStringLiteral( "double" ), 10 ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005 ), QString( "5.005005" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005005 ), QString( "5.005005005" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-09" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator, QLocale::NumberOption::DefaultNumberOptions ); QCOMPARE( doubleFieldNoPrec.displayString( 599999898999.0 ), QString( "599,999,898,999" ) ); @@ -371,8 +375,12 @@ void TestQgsField::displayString() //test double value with German locale QLocale::setDefault( QLocale::German ); QCOMPARE( doubleField.displayString( 5.005005 ), QString( "5,005" ) ); + QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4,5e-09" ) ); + QCOMPARE( doubleField.displayString( 1e-04 ), QString( "0,0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005 ), QString( "5,005005" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005005 ), QString( "5,005005005" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4,5e-09" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 1e-04 ), QString( "0,0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 599999898999.0 ), QString( "599.999.898.999" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5999.123456 ), QString( "5.999,123456" ) ); @@ -381,8 +389,12 @@ void TestQgsField::displayString() customGerman.setNumberOptions( QLocale::NumberOption::OmitGroupSeparator ); QLocale::setDefault( customGerman ); QCOMPARE( doubleField.displayString( 5.005005 ), QString( "5,005" ) ); + QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4,5e-09" ) ); + QCOMPARE( doubleField.displayString( 1e-04 ), QString( "0,0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005 ), QString( "5,005005" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005005 ), QString( "5,005005005" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4,5e-09" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 1e-04 ), QString( "0,0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 599999898999.0 ), QString( "599999898999" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5999.123456 ), QString( "5999,123456" ) ); @@ -399,8 +411,12 @@ void TestQgsField::displayString() customEnglish.setNumberOptions( QLocale::NumberOption::OmitGroupSeparator ); QLocale::setDefault( customEnglish ); QCOMPARE( doubleField.displayString( 5.005005 ), QString( "5.005" ) ); + QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-09" ) ); + QCOMPARE( doubleField.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005 ), QString( "5.005005" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005005 ), QString( "5.005005005" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-09" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 599999898999.0 ), QString( "599999898999" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5999.123456 ), QString( "5999.123456" ) ); From 87bb68bd04f1ac65dbf901a00ddcb9f4316e3e52 Mon Sep 17 00:00:00 2001 From: speillet Date: Fri, 20 Dec 2019 11:11:56 +0100 Subject: [PATCH 2/5] add scientific notation for double type when precision is mentionned --- src/core/qgsfield.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/core/qgsfield.cpp b/src/core/qgsfield.cpp index 5eff5570dc01..62cd80e4143c 100644 --- a/src/core/qgsfield.cpp +++ b/src/core/qgsfield.cpp @@ -224,7 +224,14 @@ QString QgsField::displayString( const QVariant &v ) const { if ( d->precision > 0 ) { - return QLocale().toString( v.toDouble(), 'f', d->precision ); + if ( -1 < v.toDouble() && v.toDouble() < 1 ) + { + return QLocale().toString( v.toDouble(), 'g', d->precision ); + } + else + { + return QLocale().toString( v.toDouble(), 'f', d->precision ); + } } else { From 96c7c287a757c6872f72a22f031a095fa07aef6a Mon Sep 17 00:00:00 2001 From: speillet Date: Wed, 25 Dec 2019 23:38:05 +0100 Subject: [PATCH 3/5] BUG: fix expected value for a test, due to changes in qtcore package version between bionic and disco Ubuntu release BUG: fix expected value for a test, due to changes in qtcore package version between bionic and disco Ubuntu release --- tests/src/core/testqgsfield.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/core/testqgsfield.cpp b/tests/src/core/testqgsfield.cpp index be9c4eacdc66..be52882f08a4 100644 --- a/tests/src/core/testqgsfield.cpp +++ b/tests/src/core/testqgsfield.cpp @@ -411,11 +411,11 @@ void TestQgsField::displayString() customEnglish.setNumberOptions( QLocale::NumberOption::OmitGroupSeparator ); QLocale::setDefault( customEnglish ); QCOMPARE( doubleField.displayString( 5.005005 ), QString( "5.005" ) ); - QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-09" ) ); + QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); //for recent qt package the expected value would be "4.5e-09" QCOMPARE( doubleField.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005 ), QString( "5.005005" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005005 ), QString( "5.005005005" ) ); - QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-09" ) ); + QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); //for recent qt package the expected value would be "4.5e-09" QCOMPARE( doubleFieldNoPrec.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 599999898999.0 ), QString( "599999898999" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5999.123456 ), QString( "5999.123456" ) ); From 2232709dc066426e84c316afd3c58ac5d018ae34 Mon Sep 17 00:00:00 2001 From: Peillet Sebastien Date: Mon, 6 Jan 2020 14:16:07 +0100 Subject: [PATCH 4/5] These tests have different results between azure and travis building --- tests/src/core/testqgsfield.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/core/testqgsfield.cpp b/tests/src/core/testqgsfield.cpp index be52882f08a4..424d21298672 100644 --- a/tests/src/core/testqgsfield.cpp +++ b/tests/src/core/testqgsfield.cpp @@ -411,11 +411,11 @@ void TestQgsField::displayString() customEnglish.setNumberOptions( QLocale::NumberOption::OmitGroupSeparator ); QLocale::setDefault( customEnglish ); QCOMPARE( doubleField.displayString( 5.005005 ), QString( "5.005" ) ); - QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); //for recent qt package the expected value would be "4.5e-09" + //QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); //for recent qt package the expected value would be "4.5e-09" QCOMPARE( doubleField.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005 ), QString( "5.005005" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005005 ), QString( "5.005005005" ) ); - QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); //for recent qt package the expected value would be "4.5e-09" + //QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); //for recent qt package the expected value would be "4.5e-09" QCOMPARE( doubleFieldNoPrec.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 599999898999.0 ), QString( "599999898999" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5999.123456 ), QString( "5999.123456" ) ); From 845ec85968696057594395e2f34a3082058edee8 Mon Sep 17 00:00:00 2001 From: Peillet Sebastien Date: Tue, 7 Jan 2020 16:31:09 +0100 Subject: [PATCH 5/5] apply different test depend on Qt version --- tests/src/core/testqgsfield.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/src/core/testqgsfield.cpp b/tests/src/core/testqgsfield.cpp index 424d21298672..cbc86b505122 100644 --- a/tests/src/core/testqgsfield.cpp +++ b/tests/src/core/testqgsfield.cpp @@ -411,11 +411,19 @@ void TestQgsField::displayString() customEnglish.setNumberOptions( QLocale::NumberOption::OmitGroupSeparator ); QLocale::setDefault( customEnglish ); QCOMPARE( doubleField.displayString( 5.005005 ), QString( "5.005" ) ); - //QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); //for recent qt package the expected value would be "4.5e-09" +#if QT_VERSION >= QT_VERSION_CHECK( 5, 11, 0 ) + QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-09" ) ); +#else + QCOMPARE( doubleField.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); +#endif QCOMPARE( doubleField.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005 ), QString( "5.005005" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5.005005005 ), QString( "5.005005005" ) ); - //QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); //for recent qt package the expected value would be "4.5e-09" +#if QT_VERSION >= QT_VERSION_CHECK( 5, 11, 0 ) + QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-09" ) ); +#else + QCOMPARE( doubleFieldNoPrec.displayString( 4.5e-09 ), QString( "4.5e-9" ) ); +#endif QCOMPARE( doubleFieldNoPrec.displayString( 1e-04 ), QString( "0.0001" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 599999898999.0 ), QString( "599999898999" ) ); QCOMPARE( doubleFieldNoPrec.displayString( 5999.123456 ), QString( "5999.123456" ) );