Formatted value-error string

The function
ValueErrorString(value, error, [delta, format, expformat, nonmetric])
returns a formatted value-error string terminating with a metric prefix. The intended use is with "dimensioned" quantities, see the examples.

Examples:

•print ValueErrorString(12.34e-5, 1.11e-5) + "V"
  0.12(1) mV
•print ValueErrorString(12.34e-5, 1.11e-5, delta=1e-6, format="v(±e)") + "F"
  123(±11)µF
•print ValueErrorString(12.34e-5, 1.11e-5, delta=1e-7, format="(v ± e) ") + "T"
  (123.4 ± 11.1) µT


The optional parameters make this function quite versatile. They are explained in detail in the code.

W. Harneit


// function/S ValueErrorString(value, error, [delta, format, expformat, nonmetric]) 
//	returns a formatted value-error string terminating with a metric prefix
//	intended use is with properly "dimensioned" quantities, see examples
//
// 	Examples:
// 	•print ValueErrorString(12.34e-5, 1.11e-5) + "V"
//	  0.12(1) mV
// 	•print ValueErrorString(12.34e-5, 1.11e-5, delta=1e-6, format="v(±e)") + "F"
//	  123(±11)µF
// 	•print ValueErrorString(12.34e-5, 1.11e-5, delta=1e-7, format="(v ± e) ") + "T"
//	  (123.4 ± 11.1) µT
//
//	Required parameters:	
//	variable value, error
//
//	Optional parameters:
//	variable delta (default: delta = error) -- the smallest distinguishable increment
//		this influences how many significant digits will be returned in the output (see examples)
//	string format (default: "v(e) ") -- format of value and error
//		"v" and "e" (must be small letters) are placeholders for value and error
//		if "v" is missing, output will start with value, followed by the rest of whatever you pass for format
//		if "e" is missing, "(±e) " will be appended next, then the exponential prefix (see below)
//			thus, if you say  format = " ", you'll get the format "v (±e) "
//		spaces and brackets are allowed and will appear in the output as expected
//	string expformat (default: "x 10\S%d\M ") -- format of exponential prefix if not metric
//		normally, a metric prefix is appended as appropriate (e.g., "µ" for 10^(-6))
//		the prefix is chosen such that no trailing zeroes occur in most cases (see examples)
//		if the value is outside of the range of WM prefixes "TGMk.mµnpf", the prefix is a number.
//			the default "x 10\S%d\M " is useful for Annotations etc. with formatted text
//			the prefix value is then floor(log(abs(value))) (i.e., 20 for value=3.45e20)
//		if you override the default, use %d or %+d as a placeholder for the exponent
//			"E%d" will give E20 or E-20 if the exponent is +20 or -20.
//			"E%+d" will give E+20 or E-20 if the exponent is +20 or -20.
//	variable nonmetric (default = 0) -- set to non-zero value to suppress metric prefixes
//
function/S ValueErrorString(value, error, [delta, format, expformat, nonmetric])
variable value, error, delta
string format, expformat
variable nonmetric

// set defaults for possibly missing parameters
	if( ParamIsDefault(delta) )
		delta = error
	endif
	if( ParamIsDefault(format) )
		format = "v(e) "
	endif
	if( ParamIsDefault(expformat) )
		expformat = "x 10\S%d\M "
	endif
	if( ParamIsDefault(nonmetric) )
		nonmetric = 0
	endif
	
// calculate and preformat exponent
	variable prec = floor(log(abs(delta))), eng = ceil(prec/3), digits
	string pref, result
	if( nonmetric || (eng < -5) || (eng > 4) )
		variable prec1 = floor(log(abs(value)))	// added to give normal form n.nnn(nn) Enn
		sprintf pref, expformat, prec1
		eng = prec1 / 3
		digits = prec1 - prec
	else
		pref = "fpnµm.kMGT"[5+eng]
		if( !cmpstr(pref, ".") )
			pref = ""
		endif
		digits = 3*eng - prec
	endif
	value *= 10^(-3*eng)
	error *= 10^(-3*eng)
	string digstr = num2istr(digits)
	
// parse format, set defaults
	if( strsearch(format, "v", 0) < 0 )
		format = "v" + format
	endif
	if( strsearch(format, "e", 0) < 0 )
		format += "(±e) "
	endif

// print value
	format = ReplaceString("v", format, "%."+digstr+"f")
	
// case 1: error is non-zero (full format)
	if( error != 0 )
		if( strsearch(format, "±", 0) < 0 )	// special error format, zap zeros
			format = ReplaceString("e", format, "@%."+digstr+"f@")	// mark error value with "@"
		else
			format = ReplaceString("e", format, "%."+digstr+"f")
		endif
		format += "%s"
// print whole string
		sprintf result, format, value, error, pref
		
// treat special error format: zap leading zeros, including possible decimal point
		variable errpos = strsearch(result, "@", 0), nextchar
		if( errpos >= 0 )
			do
				errpos += 1
				nextchar = char2num(result[errpos])
				if( (nextchar == 64) || (errpos > strlen(result)) )	// "@" = 64 marks the end
					break
				endif
				// replace 0 or . from front with @ until something else is encountered
				if( (nextchar == 46) || (nextchar == 48) )
					result[errpos, errpos] = "@"
				else
					break
				endif
			while( 1 )
			result = ReplaceString("@", result, "")	// zap all "@"
			result = ReplaceString("()", result, "")	// zap brackets if they are empty
		endif
		
// case 2: error is zero (abbreviated format)
	else	// remove all elements pertaining to error
		format = ReplaceString(" e", format, "")	// try removing "e" placeholder with leading space
		format = ReplaceString("e", format, "")	// remove "e" place holder anyway
		format = ReplaceString(" ±", format, "")	// try removing "±" with leading space
		format = ReplaceString("±", format, "")	// remove "±" anyway
		format = ReplaceString("(", format, "")	// remove brackets
		format = ReplaceString(")", format, "")
		format += "%s"
// print whole string
		sprintf result, format, value, pref
	endif
	return result
end

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More