 scottrod
		
			scottrod
		
		
		
		
		
		
		
		
	
			10-27-2015 01:23 PM
I have an app where a user inputs a value, calculations are performed, and it spits out the desired result in a Numeric control as a double variable.
Output values can range from the hundreds to the hundreds of millions.
I'd like to convert the final result to a string using the format or scan functions (easy enough), but I also want to add commas or spaces so output numbers can look like 123,456,789 or 10,234 instead of 123456789 and 10234 for the end-user's ease of recognition.
I can envision a way to do it, but it involves a lot of tedious code. Anyone have a suggestion for a simple way?
It seems some of the most basic housekeeping in CVI is its biggest time-sucker, for me anyway.
Scott in Ohio
 
					
				
		
 RobertoBozzolo
		
			RobertoBozzolo
		
		
		
		
		
		
		
		
	
			10-28-2015 05:05 AM - edited 10-28-2015 05:05 AM
There isn't a standard function that formats with grouping so you'll have to write your own. A search on Internet returned for example this page that offers several solutions. Based on one of them I wrote this function that outputs a string formatted according to system locale:
//----------------------------------------------------------------------------------
// Function DoubleToGroupedString ()
//----------------------------------------------------------------------------------
/// HIFN DoubleToGroupedString
/// HIFN Formats a double value in a string grouping numbers according to system settings
/// HIPAR value/The value to format
/// HIPAR digits_of_precision/Number of digits after the decimal point
/// HIPAR string/The output string
/// HIRET Always 0
int DoubleToGroupedString (double value, int digits_of_precision, char *string)
{
	int	n, fracPart, order_of_magnitude;
	double	intgPart;
	char	decSep[8], thouSep[8];
	// Get separators set in the system
	GetLocaleInfoEx (LOCALE_NAME_USER_DEFAULT, LOCALE_SDECIMAL,  (LPWSTR)decSep,  8);
	GetLocaleInfoEx (LOCALE_NAME_USER_DEFAULT, LOCALE_STHOUSAND, (LPWSTR)thouSep, 8);
	// Split number into integral and fractional part
	// Pad fractional part according to user specifications
	fracPart = abs(modf (value, &intgPart) * pow (10, digits_of_precision));
	// Elaborate on the integral part
	n = (int)intgPart;
	order_of_magnitude = (n == 0) ? 1 : (int)pow (10, ((int)floor (log10 (abs(n))) / 3) * 3);
	// Begin building the output string
	sprintf (string, "%d", n / order_of_magnitude);
	for (n = abs (n) % order_of_magnitude, order_of_magnitude /= 1000;
			order_of_magnitude > 0;
			n %= order_of_magnitude, order_of_magnitude /= 1000)
	{
		sprintf (string, "%s%s%03d", string, thouSep, abs (n / order_of_magnitude));
	}
	// Add fractional part
	sprintf (string, "%s%s%d", string, decSep, fracPart);
	// Output in the Debug Output window
	DebugPrintf ("Number: %f\n", value);
	DebugPrintf ("Order of magnitude: %d\n", order_of_magnitude);
	DebugPrintf ("Digits of precision: %d\n", digits_of_precision);
	DebugPrintf ("Formatted output: %s\n", string);
	return 0;
}
GetLocaleInfoEx is part of Win32 APIs: you must include windows.h; no additional library is needed besides those included by default. The function is available both for base and full version of CVI.