/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠJ Ã¼ rg en ĠRe ich mann , ĠJet ting en , ĠGermany Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġde . rd vs b . km util Ċ Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . log Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . ulp Ċ Ċ public Ġexpect Ġval Ġkm String Fmt Grouping Flag : ĠChar Ġ// ĠJVM Ġexpects Ġ",", Ġnative Ġ"'" Ġfor Ġthousands Ġsep Ċ Ċ public Ġexpect Ġfun Ġ< T > ĠString . sprintf ( t : ĠT ): ĠString Ċ Ċ public Ġfun ĠByte . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠU Byte . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠShort . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠU Short . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠInt . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠUInt . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠLong . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠU Long . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠFloat . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ public Ġfun ĠDouble . to Fmt ( fmt : ĠString ): ĠString Ġ= Ġfmt . sprintf ( this ) Ċ Ċ private Ġval Ġmetric Indicators Ge 1 Ġ= Ġchar ArrayOf (' Ġ', Ġ' K ', Ġ' M ', Ġ' G ', Ġ' T ', Ġ' P ', Ġ' E ', Ġ' Z ', Ġ' Y ') Ċ private Ġval Ġmetric Indicators Lt 1 Ġ= Ġchar ArrayOf (' m ', Ġ' Â µ ', Ġ' n ', Ġ' p ', Ġ' f ', Ġ' a ', Ġ' z ', Ġ' y ') Ċ public Ġfun Ġ< T > ĠT . fmt Metric ( unit : ĠString , Ġf Width : ĠInt Ġ= Ġ 0 , Ġprec : ĠInt Ġ= Ġ 1 , Ġmetric Prefix : ĠString Ġ= Ġ" Ġ" ): ĠString Ġ{ Ċ ĉ // Ġformat Ġan Ġnumber Ġin Ġa Ġreasonable Ġmetric Ġe . g . Ġ 1 _ 2 3 4 _ 4 5 6 . fmt Metric (" B ") Ġ=> Ġ" 1 . 2 3 4 ĠMB " Ċ ĉ // Ġf Width Ġis Ġonly Ġapplied Ġto Ġthe Ġresulting Ġnumber . ĠThe Ġresult Ġis Ġat Ġleast Ġlength ( metric Prefix )+ 1 Ġlonger Ġthan Ġf Width Ċ ĉ var Ġd : ĠDouble ĊĊ ĉ when Ġ( this ) Ġ{ Ċĉ ĉ is ĠInt ĠĠĠ Ġ-> Ġd Ġ= Ġthis . toDouble () Ċĉ ĉ is ĠLong ĠĠ Ġ-> Ġd Ġ= Ġthis . toDouble () Ċĉ ĉ is ĠFloat Ġ Ġ-> Ġd Ġ= Ġthis . toDouble () Ċĉ ĉ is ĠDouble Ġ-> Ġd Ġ= Ġthis Ċĉ ĉ is ĠByte ĠĠ Ġ-> Ġd Ġ= Ġthis . toDouble () Ċĉ ĉ is ĠShort Ġ Ġ-> Ġd Ġ= Ġthis . toDouble () Ċĉ ĉ is ĠUInt ĠĠ Ġ-> Ġd Ġ= Ġthis . to Long (). toDouble () ĊĊĉ ĉ is ĠU Long Ġ Ġ-> Ġ{ Ċĉĉ ĉ if Ġ( this Ġ> ĠLong . MAX _ VALUE . to UInt ()) Ġ{ Ċĉĉĉ ĉ d Ġ= Ġ(( this Ġ- Ġ 1 UL Ġ- ĠLong . MAX _ VALUE . to UL ong ()). to Long ()). toDouble () Ġ+ ĠLong . MAX _ VALUE . toDouble () Ġ+ Ġ 1 . 0 Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ d Ġ= Ġthis . to Long (). toDouble () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ is ĠU Byte Ġ Ġ-> Ġd Ġ= Ġthis . toInt (). toDouble () Ċĉ ĉ is ĠU Short Ġ-> Ġd Ġ= Ġthis . toInt (). toDouble () Ċĉ ĉ else ĠĠĠĠĠ Ġ-> Ġreturn Ġthis . toString () Ċ ĉ } Ċ ĉ // Ġ 1 0 0 0 Z 0 0 0 E 0 0 0 T 0 0 0 G 0 0 0 M 0 0 0 K 0 0 0 Ċ ĉ // Ċ ĉ // Ġ 0 0 1 8 Z 4 4 6 E 7 4 4 T 0 7 3 G 7 0 9 M 5 5 1 K 6 1 5 ĊĊ ĉ val Ġis Val Negative Ġ= Ġif Ġ( d Ġ< Ġ 0 . 0 ) Ġ{ Ċĉ ĉ d Ġ= Ġ- d ; Ċĉ ĉ true Ċ ĉ } Ġelse Ġ{ Ċĉ ĉ false Ċ ĉ } ĊĊ ĉ var Ġmetric Ġ= Ġ' Ġ' ĊĊ ĉ when Ġ{ Ċĉ ĉ d Ġ== Ġ 0 . 0 Ġ-> Ġ{} Ċĉ ĉ d Ġ< Ġ 1 . 0 Ġ-> Ġ{ Ċĉĉ ĉ val Ġld Ġ= Ġfloor ( Ġlog ( d , Ġ 1 0 . 0 )) Ċĉĉ ĉ var Ġeng Exp Ix : ĠInt Ġ= Ġ-( ld . toInt ()+ 1 ) Ġ/ Ġ 3 Ġ// Ġcompute Ġengineering Ġexponent Ġindex Ġ 0 . 0 0 0 1 Ġ=> Ġ 1 Ċĉĉ ĉ // println (" fmt Metric Ġd =$ d , Ġld =$ ld , Ġeng Exp Ix =$ eng Exp Ix ") Ċĉĉ ĉ if Ġ( eng Exp Ix Ġ>= Ġmetric Indicators Lt 1 . size ) Ġeng Exp Ix Ġ= Ġmetric Indicators Lt 1 . size Ġ- Ġ 1 Ċĉĉ ĉ metric Ġ= Ġmetric Indicators Lt 1 [ eng Exp Ix ] Ċĉĉ ĉ d Ġ*= Ġ 1 0 . 0 . pow (( eng Exp Ix + 1 )* 3 ) Ċĉ ĉ } Ċĉ ĉ else Ġ-> Ġ{ Ċĉĉ ĉ val Ġld Ġ= Ġlog ( d , Ġ 1 0 . 0 ) Ċĉĉ ĉ val Ġl df Ġ= Ġfloor ( ld Ġ+ Ġld . ulp ) Ġ// Ġe . g . Ġfor Ġd = 1 0 0 0 . 0 , Ġld Ġis Ġ 2 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 6 Ġand Ġl df Ġwould Ġresult Ġin Ġ 2 Ġbut Ġmust Ġbe Ġ 3 Ġhere . ĠSolution : Ġadd Ġld . udp Ġand Ġwe Ġget Ġ 3 . 0 Ċĉĉ ĉ var Ġeng Exp Ix : ĠInt Ġ= Ġl df . toInt () Ġ/ Ġ 3 Ġ// Ġcompute Ġengineering Ġexponent Ġindex Ġ 1 _ 0 0 0 Ġ=> Ġ 1 Ċĉĉ ĉ // println ("\ n fmt Metric Ġd =$ d , Ġld =$ ld , Ġld + ld . ulp =${ ld Ġ+ Ġld . ulp }, Ġl df =$ ld f , Ġeng Exp Ix =$ eng Exp Ix ") Ċĉĉ ĉ if Ġ( eng Exp Ix Ġ>= Ġmetric Indicators Ge 1 . size ) Ġeng Exp Ix Ġ= Ġmetric Indicators Ge 1 . size Ġ- Ġ 1 Ċĉĉ ĉ metric Ġ= Ġmetric Indicators Ge 1 [ eng Exp Ix ] Ċĉĉ ĉ d Ġ/= Ġ 1 0 . 0 . pow ( eng Exp Ix * 3 ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ if Ġ( is Val Negative ) Ġd Ġ= Ġ- d ĊĊ ĉ var Ġfmt Ġ= ĠStringBuilder ("% ") Ċ ĉ fmt . append Ġ( km String Fmt Grouping Flag ) Ġ// Ġ, Ġor Ġ' Ċ ĉ if Ġ( f Width Ġ!= Ġ 0 ) Ġfmt . append ( f Width ) Ċ ĉ fmt . append ('.'); Ġfmt . append ( prec ) Ċ ĉ fmt . append (' f ') Ċ ĉ fmt . append ( metric Prefix ) Ċ ĉ if Ġ( metric Ġ!= Ġ' Ġ') Ġfmt . append ( metric ) Ċ ĉ fmt . append ( unit ) Ċ ĉ return Ġfmt . toString (). sprintf ( d ) Ċ } Ċ