Value ± Error rounding

I have a problem that I am trying to solve. Can anyone help me please?

I have as an input a value and its error (uncertainty). I want to create a string that is the Value ± Error but with appropriate rounding on both numbers. By appropriate rounding, I mean 2 significant figures in the error value.

I have written the following function that does mostly does this, but has some exceptions to which I am struggling to find a simple resolution.


Function/S FormatValueError(vVal,vErr)
	variable vVal
	variable vErr
	// Return string containing value ± error rounded to 2 sf on error
	// or "" if there was a problem
	string sValErr = ""
	string sVal,sErr
	variable vPower
	do
		if( numType(vVal) == 2) //NaN
			break // return empty string
		endif
		if( (numType(vErr) == 2) || (vErr == 0) ) // NaN or zero
			sprintf sValErr, "%g", vVal // just return vVal
			break
		endif
		// Find power 10 of Error
		variable vErrPower = floor( log( abs(vErr) ) )
		vErrPower -= 1 // go to 2 sf
		// Find power 10 of Value
		variable vValPower = floor( log( abs(vVal) ) )
		if( vValPower < vErrPower ) // catch value less than error
			vPower = vValPower - 1 //round to 2 sf in Value
		else
			vPower = vErrPower // round to 2 sf in Error
		endif
		// Now do the rounding
		vVal=sign(vVal) * (10 ^ vPower) * round( abs(vVal) * (10 ^ (-vPower) ) )
		sprintf sVal,"%g",vVal
		vErr=sign(vErr) * (10 ^ vPower) * round( abs(vErr) * (10 ^ (-vPower) ) )
		sErr=num2str(vErr)
		sprintf sErr,"%g",vErr
		// assemble the result
		sValErr = sVal
		if( strLen(sErr) > 0)
			sValErr += " ± " + sErr
		endif
		break
	while(1)
	return sValErr
End


For example:
print FormatValueError(123.456,7.123456)
gives 123.5 ± 7.1 (correct)

print FormatValueError(1.008,0.111)
gives 1.01 ± 0.11 (correct)

print FormatValueError(1.0008,0.111)
gives 1 ± 0.11 (no - I would like to get 1.00 ± 0.11)

print FormatValueError(123.456E-4,1.345678E-5)
gives 0.012346 ± 1.3e-05 (no - I would like 0.012346 ± 0.000013 or 1234.6e-5 ± 1.3e-5)

Is there a cunning way of achieving the last two results without doing a heavy handed look for each type of number format and deal with each foreseeable situation bit by bit?

Thank you,
Kurt
KurtB wrote:
Is there a cunning way of achieving the last two results without doing a heavy handed look for each type of number format and deal with each foreseeable situation bit by bit?


Try
printf
and
sprintf
.