I changed the standard functionality for Phone field of Customers form so that the input phone number will be formatted as (xxx) xxx-xxxx[x]
For example, if one input 1234567890 it will be presented and saved as (123) 456-7890
===>
For 12fs3.45*6.78--90 it will be presented and saved as (123) 456-7890 with no non-numericals.
12345678901234567 will be as (123) 456-7890123456 it does not truncate the tail.
If finally it does not look like (xxx) xxx-xxxx the system alerts the user about that however the input value will be saved.
The following methods were added/changed:
ClassDeclaration of Customers form
public class FormRun extends ObjectRun
{
...
boolean sisValidateCalled;
}
StringEdit Phone field methods:
{
super();
sisValidateCalled = false;
}
public boolean validate()
{
#define.CorrectPhoneLettersNumber(14)
boolean ret;
int length;
Phone newPhone;
;
ret = super();
// creates new phone number in the format (xxx) xxx-xxxx[x]
newPhone = SISTools::formatPhoneNumber(this.text());
length = strlen(newPhone);
if (length != #CorrectPhoneLettersNumber)
checkFailed(strfmt("Phone numbers should be like: (xxx) xxx-xxxx"));
CustTable.Phone = newPhone;
CustTable_ds.write();
sisValidateCalled = true;
return ret;
}
public boolean leave()
{
boolean ret;
ret = super();
if (!sisValidateCalled)
this.validate();
return ret;
}
SISTools class (some collection of utilities)
static public Phone formatPhoneNumber(Phone _phone = "")
{
Phone newPhone = "";
str char;
int length = strlen(_phone);
int i;
container numbers = ['0','1','2','3','4','5','6','7','8','9'];
;
// remove all non numbers from field text
for (i=1; i<=length; i++)
{
char = substr(_phone,i,1);
if (confind(numbers,char))
{
newPhone = newPhone + char;
}
}
length = strlen(newPhone);
// create new phone number in the format (xxx) xxx-xxxx from 1234567890
newPhone = "(" + substr(newPhone,1,3) + ") " + substr(newPhone,4,3) + "-" + substr(newPhone,7, length-6);
return newPhone;
}
Inspired by Sonny Wibaba Adi