From 631bbb568dd28540cfdab31d0f25bb3bc37cdb58 Mon Sep 17 00:00:00 2001 From: Joris Goosen Date: Wed, 15 Jan 2025 12:36:54 +0100 Subject: [PATCH] undo ColumnUtils::doubleToString* -> Utils:: --- Common/jaspColumnEncoder | 2 +- CommonData/column.cpp | 8 ++++---- CommonData/columnutils.cpp | 20 +++++++++++++++++++ CommonData/columnutils.h | 3 +++ Desktop/data/importers/jaspimporterold.cpp | 2 +- .../readstat/readstatimportcolumn.cpp | 6 +++--- .../models/listmodelfiltereddataentry.cpp | 3 ++- 7 files changed, 34 insertions(+), 10 deletions(-) diff --git a/Common/jaspColumnEncoder b/Common/jaspColumnEncoder index 1dfc2421ff..094a53c3d8 160000 --- a/Common/jaspColumnEncoder +++ b/Common/jaspColumnEncoder @@ -1 +1 @@ -Subproject commit 1dfc2421ff45ac9a52ffa888a3fac4e15ff630c7 +Subproject commit 094a53c3d8b3375bcb486ec2ded5843e15933291 diff --git a/CommonData/column.cpp b/CommonData/column.cpp index c67b7fe514..6f228ed281 100644 --- a/CommonData/column.cpp +++ b/CommonData/column.cpp @@ -983,7 +983,7 @@ stringvec Column::nonFilteredLevels() levels.insert(label->label()); } else if(!isEmptyValue(_dbls[r])) - levels.insert(Utils::doubleToString(_dbls[r])); + levels.insert(ColumnUtils::doubleToString(_dbls[r])); } // Use the right label order @@ -1164,7 +1164,7 @@ std::string Column::doubleToDisplayString(double dbl, bool fancyEmptyValue, bool ignoreEmptyValue = ignoreEmptyValue && !std::isnan(dbl); if (isEmptyValue(dbl) && !ignoreEmptyValue) return fancyEmptyValue ? EmptyValues::displayString() : ""; - else return Utils::doubleToString(dbl); + else return ColumnUtils::doubleToString(dbl); } std::string Column::operator[](size_t row) @@ -1416,7 +1416,7 @@ bool Column::replaceDoubleLabelFromRowWithDouble(size_t row, double dbl) dblsRef = dbl; _labelsTempDbls[row] = dbl; - _labelsTemp[row] = Utils::doubleToString(dbl); + _labelsTemp[row] = ColumnUtils::doubleToString(dbl); return true; } @@ -1580,7 +1580,7 @@ bool Column::setValue(size_t row, const std::string & value, const std::string & if(justAValue && !newLabel && itsADouble) { - const std::string valueDbl = Utils::doubleToString(newDoubleToSet); + const std::string valueDbl = ColumnUtils::doubleToString(newDoubleToSet); newLabel = labelByValue(valueDbl); newLabel = newLabel ? newLabel : labelByValueAndDisplay(valueDbl, valueDbl); } diff --git a/CommonData/columnutils.cpp b/CommonData/columnutils.cpp index 55e1b8a9d0..b923589868 100644 --- a/CommonData/columnutils.cpp +++ b/CommonData/columnutils.cpp @@ -210,6 +210,26 @@ std::string ColumnUtils::deEuropeaniseForImport(std::string value) return value; } +std::string ColumnUtils::doubleToStringMaxPrec(double dbl) +{ + constexpr auto max_precision{std::numeric_limits::digits10 + 1}; + return doubleToString(dbl, max_precision); +} + +std::string ColumnUtils::doubleToString(double dbl, int precision) +{ + JASPTIMER_SCOPE(ColumnUtils::doubleToString); + + if (dbl > std::numeric_limits::max()) return "∞"; + if (dbl < std::numeric_limits::lowest()) return "-∞"; + + std::stringstream conv; //Use this instead of std::to_string to make sure there are no trailing zeroes (and to get full precision) + conv << std::setprecision(precision); + conv << dbl; + return conv.str(); +} + + // hex should be 4 hexadecimals characters std::string ColumnUtils::_convertEscapedUnicodeToUTF8(std::string hex) { diff --git a/CommonData/columnutils.h b/CommonData/columnutils.h index 6bd80deece..761ac304a2 100644 --- a/CommonData/columnutils.h +++ b/CommonData/columnutils.h @@ -22,6 +22,9 @@ class ColumnUtils static void convertEscapedUnicodeToUTF8( std::string & inputStr); static std::string deEuropeaniseForImport( std::string value); //Convert a string to a double with a dot for a separator + + static std::string doubleToString( double dbl, int precision = 10); + static std::string doubleToStringMaxPrec( double dbl); static bool convertVecToInt( const stringvec & values, intvec & intValues, intset & uniqueValues); static bool convertVecToDouble( const stringvec & values, doublevec & doubleValues); diff --git a/Desktop/data/importers/jaspimporterold.cpp b/Desktop/data/importers/jaspimporterold.cpp index 802394cfb0..2e7f427865 100644 --- a/Desktop/data/importers/jaspimporterold.cpp +++ b/Desktop/data/importers/jaspimporterold.cpp @@ -200,7 +200,7 @@ void JASPImporterOld::loadDataArchive_1_00(const std::string &path, std::functio if (isScalar) { - values.push_back(Utils::doubleToString(*reinterpret_cast(buff))); + values.push_back(ColumnUtils::doubleToString(*reinterpret_cast(buff))); labels.push_back(values.back()); } else diff --git a/Desktop/data/importers/readstat/readstatimportcolumn.cpp b/Desktop/data/importers/readstat/readstatimportcolumn.cpp index fc48f7caa5..31a9c2a762 100644 --- a/Desktop/data/importers/readstat/readstatimportcolumn.cpp +++ b/Desktop/data/importers/readstat/readstatimportcolumn.cpp @@ -45,8 +45,8 @@ std::string ReadStatImportColumn::readstatValueToString(const readstat_value_t & case READSTAT_TYPE_INT8: return std::to_string (int( readstat_int8_value(value)) ); case READSTAT_TYPE_INT16: return std::to_string (int( readstat_int16_value(value)) ); case READSTAT_TYPE_INT32: return std::to_string (int( readstat_int32_value(value)) ); - case READSTAT_TYPE_FLOAT: return Utils::doubleToStringMaxPrec ( readstat_float_value(value) ); - case READSTAT_TYPE_DOUBLE: return Utils::doubleToStringMaxPrec ( readstat_double_value(value) ); + case READSTAT_TYPE_FLOAT: return ColumnUtils::doubleToStringMaxPrec ( readstat_float_value(value) ); + case READSTAT_TYPE_DOUBLE: return ColumnUtils::doubleToStringMaxPrec ( readstat_double_value(value) ); case READSTAT_TYPE_STRING_REF: throw std::runtime_error("File contains string references and we do not support this."); } @@ -69,7 +69,7 @@ const stringvec &ReadStatImportColumn::labels() const void ReadStatImportColumn::addValue(const readstat_value_t & value) { bool setMiss = readstat_value_is_tagged_missing(value) || (_readstatVariable && readstat_value_is_defined_missing(value, _readstatVariable)); - std::string valStr = Utils::doubleToString(EmptyValues::missingValueDouble); + std::string valStr = ColumnUtils::doubleToString(EmptyValues::missingValueDouble); if(readstat_value_is_tagged_missing(value)) //This is from sas/stata and actual value is NaN but there is a tag. So we use that as a value, this will be converted to NaN later anyway { diff --git a/QMLComponents/models/listmodelfiltereddataentry.cpp b/QMLComponents/models/listmodelfiltereddataentry.cpp index a293702f3b..900c266469 100644 --- a/QMLComponents/models/listmodelfiltereddataentry.cpp +++ b/QMLComponents/models/listmodelfiltereddataentry.cpp @@ -5,6 +5,7 @@ #include "controls/jaspcontrol.h" #include "filter.h" #include "dataset.h" +#include "columnutils.h" ListModelFilteredDataEntry::ListModelFilteredDataEntry(TableViewBase * parent) : ListModelTableViewBase(parent) @@ -365,7 +366,7 @@ void ListModelFilteredDataEntry::informDataSetOfInitialValues() QVariantList vals; for(size_t i=0; i<_initialValues.size(); i++) { - vals.append(_acceptedRows[i] ? tq(Utils::doubleToString(_initialValues[i])) : ""); + vals.append(_acceptedRows[i] ? tq(ColumnUtils::doubleToString(_initialValues[i])) : ""); if(_acceptedRows[i]) somethingFilled = true; }