Behind the scenes the data in the Text attribute and the Numeric attribute can be the same. The Mask and the Decimal places are only relevant for display to the user.
As we cannot dynamically set the Mask and the decimal places (yet) I would solve as follows....
In the Agency BO you have a MaskType (A, B or C) and you have a DecimalPlacesType (A, B or C)
You can make this User changeable or Admin changable.
Then have 4 Attributes for each
AgencyString TEXT 20 no mask (this holds the RAW value)
AgencyStringTypeA TEXT 20 Mask LL-000-00a
AgencyStringTypeB TEXT 20 Mask 00-AAAAAA
AgencyStringTypeC TEXT 20 Mask 00000-00
Similarly for the Number...
AgencyNumber NUMBER n (this holds the RAW value)
AgencyNumberTypeA Number #.0
AgencyNumberTypeB Number #.00
AgencyNumberTypeC Number #.000
Then you have the following BO Rules
Rule: READ PROTECT Correct Strings
IF AgencyMakType='A' THEN
READ PROTECT AgencyStringTypeB
READ PROTECT AgencyStringTypeC
ELSE
IF AgencyMakType='B' THEN
READ PROTECT AgencyStringTypeA
READ PROTECT AgencyStringTypeC
ELSE
IF AgencyMakType='C' THEN
READ PROTECT AgencyStringTypeA
READ PROTECT AgencyStringTypeB
Rule: Set Raw String
IF Agency.MaskType='A' THEN
AgencyString=AgencyStringA
ELSE
IF Agency.MaskType='B' THEN
AgencyString=AgencyStringB
ELSE
IF Agency.MaskType='C' THEN
AgencyString=AgencyStringC
And then use a similar methodology for the Numeric also.
Then elsewhere in the app.... any calcs on the Numeric or rules that use the string , use the RAW values.