Brian Dunning's FileMaker Custom Functions

EngNotation ( number ; digits )

Express a number in engineering notation

  Average rating: 4.3 (27 votes) Log in to vote

Paul Smith   Paul Smith
unafilliated
http://facebook.com/psmithw

Share on Facebook Share on Twitter

  Sample input:
EngNotation ( -.0000400001195 ; 8 )
  Sample output:
-40.000120 μ

  Function definition: (Copy & paste into FileMaker's Edit Custom Function window)

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.

 

Comments

comment   comment, VR
Feb 21, 2015
Couldn't this be simpler? Compare: http://www.briandunning.com/cf/220
 
Paul Smith   Paul Smith, NC
Feb 24, 2015
/* 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 ; "?" )
)
 

Log in to post comments.

 

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

Under construction. Email me your wish list for improvements.