Shopping Cart

Search:

Signup

Contact

FileMaker is a registered trademark of FileMaker, Inc. in the U.S. and other countries.

# FileMaker Pro Custom Functions

EngNotation ( number; digits )

Rate this function:

Discuss this Custom Function

Paul Smith, unafilliated

Express a number in engineering notation

Sample Input:
 EngNotation ( -.0000400001195 ; 8 )
Sample Output:
 -40.000120 μ

Then copy & paste into FileMaker Advanced's Edit Custom Function window.

## Description:

Uses standard engineering symbols from fempto to peta and "e" notation for values outside those limits.

Expresses all values in powers of 10^3, so ".4" would be "400 m". rounds to the number of digits passes to the function.

Non-recursive due to the use of the logarithm function.

Note: these functions are not guaranteed or supported by BrianDunning.com. Please contact the individual developer with any questions or problems.

This is my Custom Function and I want to edit it

## Discuss:

Couldn't this be simpler? Compare: http://www.briandunning.com/cf/220

comment, VR
February 21, 2015 7:37am

/* Edit: some bug fixes for number rounding and refactored code for readability */
/*
EngNotation ( number; digits )
EngNotation ( -.0000400001195 ; 8 ) >>> -40.000120 μ
Uses standard engineering symbols from fempto to peta and "e" notation for values outside those limits.
Non-recursive due to the use of the logarithm function.
*/

Let (
[ numAbs = Abs ( number )
; numSign = If ( number < 0 ; "-" ; "" )
; digitsPower = If ( numAbs ; Floor ( Log ( numAbs ) ) ; 0 )
; digits10e3s = Div ( digitsPower ; 3 )
; digits10e1s = digits10e3s * 3

; roundPlaces = ( digits + digits10e1s ) - ( digitsPower + 1 )
; precisePlaces = 3 + digits - digitsPower
; numTerm = Round ( SetPrecision ( numAbs / ( 10 ^ digits10e1s ) ; preciseplaces ) ; roundplaces )

; zerosAdd = digits + GetAsBoolean ( PatternCount ( numTerm ; "." ) ) - Length ( numTerm )
; zerosExtra = Right ( SerialIncrement ( "0" ; SetPrecision ( 10 ^ ( zerosAdd ) ; zerosAdd + 1 ) ) ; zerosAdd )
; outTerm = numTerm & If ( zerosAdd > 0 ; If ( not GetAsBoolean ( PatternCount ( numTerm ; "." ) ) ; "." ) & zerosExtra )

; ePower = "e" & If ( Abs ( digits10e1s ) = digits10e1s ; "+" ) & ( digits10e1s )
; eSymbol = GetValue ( If ( digits10e3s < 0 ; " m¶ μ¶ n¶ p¶ f" ; " K¶ M¶ G¶ T¶ P" ) ; Abs ( digits10e3s ) )
; outSymbol = If ( Abs ( digits10e3s ) > 5 ; ePower & " " ; eSymbol )
] ;
If ( IsValidExpression ( numSign & outTerm & ePower ) ; numSign & outTerm & outSymbol ; "?" )
)

Paul Smith, NC
February 24, 2015 7:38pm