diff --git a/src/core/qgsexpression.cpp b/src/core/qgsexpression.cpp index c849c8ab067..6a0e6a9ea02 100644 --- a/src/core/qgsexpression.cpp +++ b/src/core/qgsexpression.cpp @@ -29,6 +29,13 @@ #include "qgsgeometry.h" #include "qgslogger.h" +//non qt includes +#include + +#ifdef _MSC_VER +#define round(x) ((x) >= 0 ? floor((x)+0.5) : floor((x)-0.5)) +#endif + // from parser extern QgsExpression::Node* parseExpression( const QString& str, QString& parserErrorMsg ); @@ -768,6 +775,13 @@ static QVariant fcnGeomPerimeter( const QVariantList& , QgsFeature* f, QgsExpres return QVariant( calc->measurePerimeter( f->geometry() ) ); } +static QVariant fcnRound( const QVariantList& values , QgsFeature* f, QgsExpression* parent ) +{ + double number = getDoubleValue( values.at( 0 ), parent ); + double scaler = pow( 10.0, getIntValue( values.at( 1 ), parent ) ); + return QVariant( round( number * scaler ) / scaler ); +} + QList QgsExpression::gmBuiltinFunctions; const QList &QgsExpression::BuiltinFunctions() @@ -788,6 +802,7 @@ const QList &QgsExpression::BuiltinFunctions() << FunctionDef( "ln", 1, fcnLn, QObject::tr( "Math" ) ) << FunctionDef( "log10", 1, fcnLog10, QObject::tr( "Math" ) ) << FunctionDef( "log", 2, fcnLog, QObject::tr( "Math" ) ) + << FunctionDef( "round", 2, fcnRound, QObject::tr( "Math" ) ) // casts << FunctionDef( "toint", 1, fcnToInt, QObject::tr( "Conversions" ) ) << FunctionDef( "toreal", 1, fcnToReal, QObject::tr( "Conversions" ) ) diff --git a/tests/src/core/testqgsexpression.cpp b/tests/src/core/testqgsexpression.cpp index 33fb9f8c258..367590b4b87 100644 --- a/tests/src/core/testqgsexpression.cpp +++ b/tests/src/core/testqgsexpression.cpp @@ -246,6 +246,8 @@ class TestQgsExpression: public QObject QTest::newRow( "log10(100)" ) << "log10(100)" << false << QVariant( 2. ); QTest::newRow( "log(2,32)" ) << "log(2,32)" << false << QVariant( 5. ); QTest::newRow( "log(10,1000)" ) << "log(10,1000)" << false << QVariant( 3. ); + QTest::newRow( "round(1234.557,2) - round up" ) << "round(1234.557,2)" << false << QVariant( 1234.56 ); + QTest::newRow( "round(1234.554,2) - round down" ) << "round(1234.554,2)" << false << QVariant( 1234.55 ); // cast functions QTest::newRow( "double to int" ) << "toint(3.2)" << false << QVariant( 3 );