package Ġcom . ink ind . RN Money Input Ċ Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . On Focus ChangeListener Ċ import Ġandroid . widget . EditText Ċ import Ġcom . facebook . react . bridge .* Ċ import Ġcom . facebook . react . u im an ager . UI Manager Module Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . text . Decimal Format Symbols Ċ import Ġjava . text . NumberFormat Ċ import Ġjava . util .* Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ fun ĠRead able Map . string ( key : ĠString ): ĠString ? Ġ= Ġthis . getString ( key ) Ċ class ĠRN Money Input Module ( private Ġval Ġcontext : ĠReact ApplicationContext ) Ġ: ĠReact Context Base Java Module ( context ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetName () Ġ= Ġ" RN Money Input " ĊĊĠĠĠ Ġ@ React Method ( is Blocking S ynchronous Method Ġ= Ġtrue ) ĊĠĠĠ Ġfun Ġformat Money ( value : ĠDouble , Ġlocale : ĠString ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMoney Mask . mask ( value , Ġlocale ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ React Method ( is Blocking S ynchronous Method Ġ= Ġtrue ) ĊĠĠĠ Ġfun Ġextract Value ( label : ĠString ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMoney Mask . un mask ( label ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ React Method ĊĠĠĠ Ġfun Ġinitialize Money Input ( tag : ĠInt , Ġoptions : ĠRead able Map ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġuse Ġprepend UI Block Ġinstead Ġof Ġadd UI Block Ġsince Ġsubsequent ĠUI Ġoperations Ġin ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġqueue Ġmight Ġbe Ġremoving Ġthe Ġview Ġwe 're Ġlooking Ġto Ġupdate . ĊĠĠĠĠĠĠĠ Ġcontext . get Native Module ( UI Manager Module :: class . java ) !!. prepend UI Block Ġ{ Ġnative View Hierarchy Manager Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġview Ġneeds Ġto Ġbe Ġresolved Ġbefore Ġrunning Ġon Ġthe ĠUI Ġthread Ġbecause Ġthere 's Ġa Ġdelay Ġbefore Ġthe ĠUI Ġqueue Ġcan Ġpick Ġup Ġthe Ġrunnable . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedit Text Ġ= Ġnative View Hierarchy Manager . resolve View ( tag ) Ġas ĠEditText ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . run On Ui Queue Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMoney Text Listener . install ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġedit Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale Ġ= Ġoptions . getString (" locale ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠMoney Text Listener ( ĊĠĠĠ Ġfield : ĠEditText , ĊĠĠĠ Ġlocale : ĠString ?, ĊĠĠĠ Ġprivate Ġval Ġfocus ChangeListener : ĠOn Focus ChangeListener Ċ ) Ġ: ĠMoney Text Watcher ( ĊĠĠĠ Ġfield Ġ= Ġfield , Ġlocale Ġ= Ġlocale Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġprevious Text : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprevious Text Ġ= Ġs ?. toString () ĊĠĠĠĠĠĠĠ Ġsuper . before TextChanged ( s , Ġstart , Ġcount , Ġafter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon TextChanged ( text : ĠCharSequence , Ġcursor Position : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġtext . substring ( cursor Position , Ġcursor Position Ġ+ Ġcount ) ĊĠĠĠĠĠĠĠ Ġval Ġold Text Ġ= Ġprevious Text ?. substring ( cursor Position , Ġcursor Position Ġ+ Ġbefore ) ĊĠĠĠĠĠĠĠ Ġ// Ġtemporarily Ġdisable Ġautocomplete Ġif Ġupdated Ġtext Ġis Ġsame Ġas Ġprevious Ġtext , ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġto Ġprevent Ġautocomplete Ġwhen Ġdeleting Ġas Ġvalue Ġis Ġset Ġmultiple Ġtimes Ġfrom ĠRN ĊĠĠĠĠĠĠĠ Ġval Ġis Duplicate Payload Ġ= Ġcount Ġ== Ġbefore Ġ&& Ġnew Text Ġ== Ġold Text ĊĠĠĠĠĠĠĠ Ġif Ġ( is Duplicate Payload Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on TextChanged ( text , Ġcursor Position , Ġbefore , Ġcount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Focus Change ( view : ĠView ?, Ġhas Focus : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Focus Change ( view , Ġhas Focus ) ĊĠĠĠĠĠĠĠ Ġfocus ChangeListener . on Focus Change ( view , Ġhas Focus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTEXT _ CHANGE _ LIST ENER _ TAG _ KEY Ġ= Ġ 1 2 3 4 5 6 7 8 9 ĊĠĠĠĠĠĠĠ Ġfun Ġinstall ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield : ĠEditText , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocale : ĠString ?, ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . getTag ( TEXT _ CHANGE _ LIST ENER _ TAG _ KEY ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . remove TextChanged Listener ( field . getTag ( TEXT _ CHANGE _ LIST ENER _ TAG _ KEY ) Ġas ĠText Watcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener : ĠMoney Text Watcher Ġ= ĠMoney Text Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġfield , Ġlocale Ġ= Ġlocale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocus ChangeListener Ġ= Ġfield . on Focus ChangeListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . add TextChanged Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . setOn Touch Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . setOn Focus ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . setTag ( TEXT _ CHANGE _ LIST ENER _ TAG _ KEY , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠMoney Mask Ġ{ ĊĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval Ġdefault Locale Ġ= Ġ"${ Locale . getDefault (). display Language }_${ Locale . getDefault (). country }" ĊĊĠĠĠĠĠĠĠĠ Ġfun Ġget Locale ( identifier : ĠString ?): ĠLocale ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Parts Ġ= Ġidentifier ?. split ('_ ') ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage Ġ= Ġlocale Parts ?. get ( 0 ) Ġ?: Ġ" en " ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcountry Ġ= Ġlocale Parts ?. get ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLocale ( language , Ġcountry ) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ Ġfun Ġun mask ( text : ĠString ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre Ġ= Ġ"[ ^ 0 - 9 ] ". to Regex () ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumbers Ġ= Ġre . replace ( text , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( numbers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcent s Ġ= Ġnumbers . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcent s Ġ/ Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 Ġas ĠDouble ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ Ġfun Ġmask ( value : ĠDouble , Ġlocale : ĠString ? Ġ= Ġ" en _ US "): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Obj Ġ= Ġget Locale ( locale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformat : ĠNumber Format Ġ= ĠNumber Format . getC urrency Instance ( locale Obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat . maximum Fraction Digits Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġformat . format ( value ) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠText Watcher Ġimplementation . Ċ Ġ* Ċ Ġ* ĠText Watcher Ġimplementation , Ġwhich Ġapplies Ġmask ing Ġto Ġthe Ġuser Ġinput , Ġpicking Ġthe Ġmost Ġsuitable Ġmask Ġfor Ġthe Ġtext . Ċ Ġ* Ċ Ġ* ĠMight Ġbe Ġused Ġas Ġa Ġdecorator , Ġwhich Ġforwards ĠText Watcher Ġcalls Ġto Ġits Ġown Ġlistener . Ċ Ġ*/ Ċ open Ġclass ĠMoney Text Watcher ( ĊĠĠĠĠĠĠĠ Ġfield : ĠEditText , ĊĠĠĠĠĠĠĠ Ġvar Ġlocale : ĠString ?, ĊĠĠĠĠĠĠĠ Ġvar Ġlistener : ĠText Watcher ? Ġ= Ġnull Ċ ) Ġ: ĠText Watcher , ĠView . On Focus ChangeListener , ĠView . On Touch Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġafter Text : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġcaret Position : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġfield : ĠWeak Reference < EditText > Ġ= ĠWeak Reference ( field ) ĊĊĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( edit : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . field . get ()?. remove TextChanged Listener ( this ) ĊĠĠĠĠĠĠĠ Ġedit ?. replace ( 0 , Ġedit . length , Ġthis . after Text ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . field . get ()?. setSelection ( this . caret Position ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" money - input - android ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWARNING ! ĠYour Ġtext Ġfield Ġis Ġnot Ġconfigured Ġas Ġa Ġmoney Ġfield . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . field . get ()?. add TextChanged Listener ( this ) ĊĠĠĠĠĠĠĠ Ġthis . listener ?. after TextChanged ( edit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . listener ?. before TextChanged ( s , Ġstart , Ġcount , Ġafter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon TextChanged ( text : ĠCharSequence , Ġcursor Position : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Text Ġ= Ġtext . toString () ĊĠĠĠĠĠĠĠ Ġval Ġinput C ents Ġ= ĠMoney Mask . un mask ( input Text ) ĊĠĠĠĠĠĠĠ Ġval Ġmasked Text Ġ= ĠMoney Mask . mask ( input C ents , Ġlocale Ġ?: ĠMoney Mask . default Locale ) ĊĠĠĠĠĠĠĠ Ġval Ġis Suffix Symbol Ġ= Ġmasked Text . last (). is Digit () Ġ== Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġmasked Text . length Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġreference Ġto Ġend Ġof Ġnumber Ġsection Ġof Ġstring ĊĠĠĠĠĠĠĠ Ġval Ġend Of Input Ġ= Ġif Ġ( is Suffix Symbol ) Ġmasked Text . length Ġ- Ġ 2 Ġelse Ġmasked Text . length Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġprintln (" Cursor : Ġ${ cursor Position }") ĊĊĠĠĠĠĠĠĠ Ġ// ĠIs Ġthe Ġcursor Ġon Ġleading Ġedge Ġof Ġnumbers ? ĊĠĠĠĠĠĠĠ Ġval Ġis Leading Edge Ġ= Ġif Ġ( is Suffix Symbol ) Ġcursor Position Ġ>= Ġinput Text . length Ġ- Ġ 3 Ġelse Ġcursor Position Ġ>= Ġinput Text . length Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// ĠWas Ġthis Ġa Ġdeletion Ġor Ġmiddle Ġinsertion ? ĊĠĠĠĠĠĠĠ Ġval Ġis Deletion Ġ= Ġcount Ġ== Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġis Insert Ġ= Ġinput Text . length Ġ> Ġ 3 Ġ&& Ġ! is Deletion Ġ&& Ġ! is Leading Edge ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġdisplayed Ġtext ĊĠĠĠĠĠĠĠ Ġthis . after Text Ġ= Ġmasked Text ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdjust Ġthe Ġcursor Ġso Ġthat Ġit Ġdoesn 't Ġget Ġlost Ġin Ġthe Ġformatting ĊĠĠĠĠĠĠĠ Ġif Ġ( input C ents Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġend Of Input ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWas Ġa Ġdigit Ġdeleted Ġor Ġinserted Ġat Ġthe Ġend ? ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( is Leading Edge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġend Of Input ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWas Ġa Ġdigit Ġdeleted Ġin Ġthe Ġmiddle ? ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( is Deletion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġcursor Position ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWas Ġa Ġdigit Ġinserted Ġsomewhere Ġin Ġthe Ġmiddle ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( is Insert ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġend Of Input ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠID K Ġjust Ġgo Ġthe Ġend ... ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġend Of Input ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠApply Ġany Ġoffsets Ġcaused Ġby Ġnew Ġcommas Ġto Ġthe Ġleft Ġof Ġthe Ġcursor ĊĠĠĠĠĠĠĠ Ġif Ġ( this . caret Position Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= ĠDecimal Format Symbols ( Money Mask . getLocale ( locale )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommas After Ġ= Ġmasked Text . take ( this . caret Position Ġ- Ġ 1 ). filter { it Ġ== Ġsymbols . grouping Separator }. length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommas Before Ġ= Ġinput Text . take ( this . caret Position Ġ- Ġ 1 ). filter { it Ġ== Ġsymbols . grouping Separator }. length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġcommas After Ġ- Ġcommas Before ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ> Ġ 0 Ġ|| Ġ! is Leading Edge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . caret Position Ġ+= Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠApply Ġcaret Ġmax ĊĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġmin ( this . caret Position , Ġend Of Input ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Focus Change ( view : ĠView ?, Ġhas Focus : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġfield . get ()?. text . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( has Focus Ġ&& Ġcontent ?. length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Suffix Symbol Ġ= Ġcontent . last (). is Digit () Ġ== Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Suffix Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġmin ( this . caret Position , content . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch ( v : ĠView ?, Ġevent : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġfield . get ()?. text . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( content ?. length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Suffix Symbol Ġ= Ġcontent . last (). is Digit () Ġ== Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Suffix Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . caret Position Ġ= Ġmin ( this . caret Position , content . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġinstall On ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text : ĠEditText , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener : ĠText Watcher ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġ): ĠMoney Text Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmasked Listener Ġ= ĠMoney Text Watcher ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . add TextChanged Listener ( masked Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . on Focus ChangeListener Ġ= Ġmasked Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmasked Listener ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }