mirror of
				https://github.com/Icinga/icinga2.git
				synced 2025-11-03 21:25:56 +01:00 
			
		
		
		
	Even if a double represents an integer value, it might not be safe to cast it
to long long as it may overflow the type. Instead just use print the double
value with 0 decimals using std::setprecision.
Before:
    <1> => 18446744073709551616.to_string()
    "-9223372036854775808"
After:
    <1> => 18446744073709551616.to_string()
    "18446744073709551616"
		
	
			
		
			
				
	
	
		
			47 lines
		
	
	
		
			881 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			881 B
		
	
	
	
		
			C++
		
	
	
	
	
	
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
 | 
						|
 | 
						|
#include "base/convert.hpp"
 | 
						|
#include "base/datetime.hpp"
 | 
						|
#include <boost/lexical_cast.hpp>
 | 
						|
#include <iomanip>
 | 
						|
 | 
						|
using namespace icinga;
 | 
						|
 | 
						|
String Convert::ToString(const String& val)
 | 
						|
{
 | 
						|
	return val;
 | 
						|
}
 | 
						|
 | 
						|
String Convert::ToString(const Value& val)
 | 
						|
{
 | 
						|
	return val;
 | 
						|
}
 | 
						|
 | 
						|
String Convert::ToString(double val)
 | 
						|
{
 | 
						|
	double integral;
 | 
						|
	double fractional = std::modf(val, &integral);
 | 
						|
 | 
						|
	std::ostringstream msgbuf;
 | 
						|
	if (fractional == 0) {
 | 
						|
		msgbuf << std::setprecision(0);
 | 
						|
	}
 | 
						|
	msgbuf << std::fixed << val;
 | 
						|
	return msgbuf.str();
 | 
						|
}
 | 
						|
 | 
						|
double Convert::ToDateTimeValue(double val)
 | 
						|
{
 | 
						|
	return val;
 | 
						|
}
 | 
						|
 | 
						|
double Convert::ToDateTimeValue(const Value& val)
 | 
						|
{
 | 
						|
	if (val.IsNumber())
 | 
						|
		return val;
 | 
						|
	else if (val.IsObjectType<DateTime>())
 | 
						|
		return static_cast<DateTime::Ptr>(val)->GetValue();
 | 
						|
	else
 | 
						|
		BOOST_THROW_EXCEPTION(std::invalid_argument("Not a DateTime value."));
 | 
						|
}
 |