From 12478a6eef654287b4c4faa5fefea942faf3cec3 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 25 Oct 2019 16:38:08 +0200 Subject: [PATCH] #4918 Improve detection of numbers when parsing std string --- .../Application/Tools/RiaStdStringTools.cpp | 9 ++++--- .../UnitTests/CMakeLists_files.cmake | 1 + .../UnitTests/RiaStdStringTools-Test.cpp | 25 +++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 ApplicationCode/UnitTests/RiaStdStringTools-Test.cpp diff --git a/ApplicationCode/Application/Tools/RiaStdStringTools.cpp b/ApplicationCode/Application/Tools/RiaStdStringTools.cpp index 7cd70b225d..e0fddc62fd 100644 --- a/ApplicationCode/Application/Tools/RiaStdStringTools.cpp +++ b/ApplicationCode/Application/Tools/RiaStdStringTools.cpp @@ -34,15 +34,18 @@ std::string RiaStdStringTools::trimString( const std::string& s ) //-------------------------------------------------------------------------------------------------- bool RiaStdStringTools::isNumber( const std::string& s, char decimalPoint ) { - if ( s.size() == 0 ) return false; + if ( s.empty() ) return false; if ( findCharMatchCount( s, decimalPoint ) > 1 ) return false; if ( findCharMatchCount( s, '-' ) > 1 ) return false; if ( findCharMatchCount( s, 'e' ) > 1 ) return false; if ( findCharMatchCount( s, 'E' ) > 1 ) return false; - std::string matchChars( "0123456789eE-" ); + std::string matchChars( "0123456789eE-+" ); matchChars.append( 1, decimalPoint ); - return ( s.find_first_not_of( matchChars ) == std::string::npos ); + + auto it = s.find_first_not_of( matchChars ); + + return ( it == std::string::npos ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UnitTests/CMakeLists_files.cmake b/ApplicationCode/UnitTests/CMakeLists_files.cmake index b34b4eaa27..e75e795f68 100644 --- a/ApplicationCode/UnitTests/CMakeLists_files.cmake +++ b/ApplicationCode/UnitTests/CMakeLists_files.cmake @@ -60,6 +60,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveAnalyzer-Test.cpp +${CMAKE_CURRENT_LIST_DIR}/RiaStdStringTools-Test.cpp ) if (RESINSIGHT_ENABLE_GRPC) diff --git a/ApplicationCode/UnitTests/RiaStdStringTools-Test.cpp b/ApplicationCode/UnitTests/RiaStdStringTools-Test.cpp new file mode 100644 index 0000000000..5af8cd4639 --- /dev/null +++ b/ApplicationCode/UnitTests/RiaStdStringTools-Test.cpp @@ -0,0 +1,25 @@ +#include "gtest/gtest.h" + +#include "RiaStdStringTools.h" + +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RiaStdStringToolsTest, ParseNumbers ) +{ + auto decimalPoint = QLocale::c().decimalPoint().toLatin1(); + + { + std::string text = "8.73705e+06"; + + EXPECT_TRUE( RiaStdStringTools::isNumber( text, decimalPoint ) ); + } + + { + std::string text = "-8.73705e-06"; + + EXPECT_TRUE( RiaStdStringTools::isNumber( text, decimalPoint ) ); + } +}