26 formatter( QChar thousands,
bool showThousands, QChar decimal )
46 return QStringLiteral(
"basic" );
51 return QObject::tr(
"Number" );
61 const QChar decimal = mDecimalSeparator.isNull() ? context.
decimalSeparator() : mDecimalSeparator;
62 std::basic_stringstream<wchar_t> os;
63 os.imbue( std::locale( os.getloc(),
new formatter( mThousandsSeparator.isNull() ? context.
thousandsSeparator() : mThousandsSeparator,
64 mShowThousandsSeparator,
69 switch ( mRoundingType )
72 os << std::fixed << std::setprecision( mNumberDecimalPlaces );
84 os << std::fixed << std::setprecision( mNumberDecimalPlaces - 1 ) << 0.0;
89 const int d = std::floor( std::log10( value < 0 ? -value : value ) ) + 1;
90 const double order = std::pow( 10.0, mNumberDecimalPlaces - d );
91 os << std::fixed << std::setprecision( std::max( mNumberDecimalPlaces - d, 0 ) ) << std::round( value * order ) / order;
99 os << std::scientific << std::setprecision( mNumberDecimalPlaces );
106 QString res = QString::fromStdWString( os.str() );
108 if ( mShowPlusSign && value > 0 )
111 if ( !mShowTrailingZeros && res.contains( decimal ) )
113 int trimPoint = res.length() - 1;
117 while ( res.at( trimPoint ).toUpper() != context.
exponential().toUpper() )
123 while ( res.at( trimPoint ) == context.
zeroDigit() )
126 if ( res.at( trimPoint ) == decimal )
129 const QString original = res;
130 res.truncate( trimPoint + 1 );
132 res += original.mid( ePoint );
145 std::unique_ptr< QgsBasicNumericFormat > res = std::make_unique< QgsBasicNumericFormat >();
147 return res.release();
153 res.insert( QStringLiteral(
"decimals" ), mNumberDecimalPlaces );
154 res.insert( QStringLiteral(
"show_thousand_separator" ), mShowThousandsSeparator );
155 res.insert( QStringLiteral(
"show_plus" ), mShowPlusSign );
156 res.insert( QStringLiteral(
"show_trailing_zeros" ), mShowTrailingZeros );
157 res.insert( QStringLiteral(
"rounding_type" ),
static_cast< int >( mRoundingType ) );
158 res.insert( QStringLiteral(
"thousand_separator" ), mThousandsSeparator.isNull() ? QVariant() : QVariant::fromValue( mThousandsSeparator ) );
159 res.insert( QStringLiteral(
"decimal_separator" ), mDecimalSeparator.isNull() ? QVariant() : QVariant::fromValue( mDecimalSeparator ) );
165 mNumberDecimalPlaces =
configuration.value( QStringLiteral(
"decimals" ), 6 ).toInt();
166 mShowThousandsSeparator =
configuration.value( QStringLiteral(
"show_thousand_separator" ),
true ).toBool();
167 mShowPlusSign =
configuration.value( QStringLiteral(
"show_plus" ),
false ).toBool();
168 mShowTrailingZeros =
configuration.value( QStringLiteral(
"show_trailing_zeros" ),
false ).toBool();
170 mThousandsSeparator =
configuration.value( QStringLiteral(
"thousand_separator" ), QChar() ).toChar();
171 mDecimalSeparator =
configuration.value( QStringLiteral(
"decimal_separator" ), QChar() ).toChar();
176 return mNumberDecimalPlaces;
186 return mShowThousandsSeparator;
196 return mShowPlusSign;
206 return mShowTrailingZeros;
216 return mRoundingType;
221 mRoundingType = type;
226 return mThousandsSeparator;
231 mThousandsSeparator = character;
236 return mDecimalSeparator;
241 mDecimalSeparator = character;
A context for numeric formats.
QChar thousandsSeparator() const
Returns the thousands separator character.
QChar zeroDigit() const
Returns the zero digit character.
QChar exponential() const
Returns the exponential character.
QChar decimalSeparator() const
Returns the decimal separator character.
QChar positiveSign() const
Returns the positive sign character.
The class is used as a container of context for various read/write operations on other objects.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)