Phone Number Formatting?
When typing a phone number in the phone number field (or even text field, whichever is possible), how do I set an automatic phone number format? I would like my format to be (555) 555-5555.
30 replies
-
This is not yet possible.
Birger
-
You could try something like:
let Code := substring(Phone, 0, 3);
let Num := substring(Phone, 3, 9);
Phone := "(" + Code + ")" + " " + Numin the trigger after update box ? The above example changes 012345678 to (012) 345678 ...
Note that the Phone datatype has to be Text in this method.
-
Doesn't have to be Text you still can do in Phone field. This would be your code to get the exact you want:
let Area := substring(Number, 0, 3);
let Num := substring(Number, 3, 6);
let Num2 := substring(Number, 6, 10);
Number := "(" + Area + ")" + " " + Num + "-" + Num2If you mess up the entring the phone number you have to delete and retype the whole again otherwise it would format the already formatted form.
-
Copied and pasted...
let Area := substring(Number, 0, 3);
let Num := substring(Number, 3, 6);
let Num2 := substring(Number, 6, 10);
Number := "(" + Area + ")" + " " + Num + "-" + Num2...into "trigger after update" box for "Phone" field, but receiving message "File not found: Number at Line 1, column 28"
-
In your case:
—-
let Area := substring(Phone, 0, 3);
let Num := substring(Phone, 3, 6);
let Num2 := substring(Phone, 6, 10);
Phone := "(" + Area + ")" + " " + Num + "-" + Num2—-
Leo
-
@Birger has @Moore's request for automatic phone number formatting been added yet?
-
"Tigger after update" solutions are not always the best workarounds as those change the actual data and do not just visually display the phone number in a different way.
-
This is published in the English Webinars...
try this code in a phone field, trigger after update:
In this case the phone field name is: 'Format (000) 000-0000'. Does't matter what you enter to the field it will take out the first 10 number you enter and format that based on the the lenght of the numbers. This formula works for US phone numbers without country code!
let myNumber := trim(text('Fromat (000) 000-0000'));
let p := length(myNumber);
let myCars := "";
var myStart := 0;
var myEnd := 1;
for i in range(0, p) do
var myNum := substring(myNumber, myStart, myEnd);
if myNum = "0" or myNum = "1" or myNum = "2" or myNum = "3" or myNum = "4" or myNum = "5" or myNum = "6" or myNum = "7" or myNum = "8" or myNum = "9" then
myCars := myCars + myNum;
myStart := myStart + 1;
myEnd := myEnd + 1
else
myStart := myStart + 1;
myEnd := myEnd + 1
end
end;
if length(myCars) < 1 then
'Fromat (000) 000-0000' := null
else
if length(myCars) < 4 then
'Fromat (000) 000-0000' := myCars
else
if length(myCars) < 7 then
let Area := substring(myCars, 0, 3);
let Num := substring(myCars, 3, 6);
'Fromat (000) 000-0000' := "(" + Area + ")" + " " + Num
else
let Area := substring(myCars, 0, 3);
let Num := substring(myCars, 3, 6);
let Num2 := substring(myCars, 6, 10);
'Fromat (000) 000-0000' := "(" + Area + ")" + " " + Num + "-" + Num2
end
end
end -
@David, thank you! This works well for my needs. I still hope a built in version with some modifiers will be released that would make it easier to quickly make changes.
Could you post the link to the webinar please. -
What would I need to add/change if I would like to add a +00 country code to the above script?
-
Your welcome. Please send us an email support@nioxus.com
-
Hello Halio, I think you would need to add some sort of "if" function to check the start of the number. In the US, it is not permitted for an area code to start with "0" so I'm thinking of trying to tweak the formula to check the entered string for a 1 or 0 before formatting. If it finds a 1 or 0 I think I will just ask it to leave the number as is, if not, then I will have it run the formula... I'll post below if I get it working...
-
Thanks Art. Looking forward to your solution!
-
This code does the same thing and should be easier to modify. It strips any formatting and if the length of the number isn't at least 10 digits it will set the field to null. The code currently accepts phone numbers with 1 or 2 digit country codes.
let pNumLength := length(replacex(Phone, "\D", "g", ""));
switch pNumLength do
case 10:
Phone := replacex(Phone, "(\d{3})(\d{3})(\d{4})", "", "($1) $2-$3")
case 11:
Phone := replacex(Phone, "(\d{1})(\d{3})(\d{3})(\d{4})", "", "+$1 ($2) $3-$4")
case 12:
Phone := replacex(Phone, "(\d{2})(\d{3})(\d{3})(\d{4})", "", "+$1 ($2) $3-$4")
default:
Phone := null
end
-
Great!
-
I made a mistake with the previous code. It will strip non-numeric characters for testing the length, but it didn't update the phone number string. The following code fixes that.
let phnNum := replacex(Phone2, "\D", "g", "");
switch length(phnNum) do
case 10:
Phone2 := replacex(phnNum, "(\d{3})(\d{3})(\d)", "", "($1) $2-$3")
case 11:
Phone2 := replacex(phnNum, "(\d{1})(\d{3})(\d{3})(\d)", "", "+$1 ($2) $3-$4")
case 12:
Phone2 := replacex(phnNum, "(\d{2})(\d{3})(\d{3})(\d)", "", "+$1 ($2) $3-$4")
default:
Phone2 := null
end
-
sean, your code looks great although I don't like the idea of the field setting to null if it doesn't get 10 digits. For my use, with a variety of international numbers in my database, but with mostly US numbers, I wanted a solution that would be forgiving if I typed a "+" or 00 or both or none and just entered 10 digits. Also, since I am not the most precise person when I'm doing data entry, I thought it best if I left in a fallback option if I mistakenly dropped a digit, a system where I could go back and just type the single missing digit at the end and the formatting would take over. I'm still tweaking, the formula, but it allows one to even change between "-" and "." or whatever separator one wants for the break between the last two sets of numbers. My only regret is that I could not find an elegant way to split the digits from any punctuation or letters. I'd love a built-in code like "isdigit" or "isletter" to define character types.
-
let input := trim(text(TestPhone));
let break := "-";
let p := length(input);
let init := substr(input, 0, 1);
if init = "0" or init = "1" or init = "2" or init = "3" or init = "4" or init = "5" or init = "6" or init = "7" or init = "8" or init = "9" or init = "(" then
init := ""
else
init := substr(input, 0, 1)
end;
let digits := "";
var myStart := 0;
var myEnd := 1;
for i in range(0, p) do
var myNum := substring(input, myStart, myEnd);
if myNum = "0" or myNum = "1" or myNum = "2" or myNum = "3" or myNum = "4" or myNum = "5" or myNum = "6" or myNum = "7" or myNum = "8" or myNum = "9" then
digits := digits + myNum;
myStart := myStart + 1;
myEnd := myEnd + 1
else
myStart := myStart + 1;
myEnd := myEnd + 1
end
end;
let q := length(digits);
if q < 1 then
TestPhone := null
else
if q < 4 then
TestPhone := digits
else
if q < 7 then
let Area := substring(digits, 0, 3);
let Num3 := substring(digits, 3, 6);
TestPhone := "(" + Area + ") " + Num3
else
if q < 10 then
let Area := substring(digits, 0, 3);
let Num3 := substring(digits, 3, 6);
let Num4 := substring(digits, 6, q);
TestPhone := "(" + Area + ") " + Num3 + break + Num4
else
let prefix := substring(digits, 0, q - 10);
let Area := substring(digits, q - 10, q - 7);
let Num3 := substring(digits, q - 7, q - 4);
let Num4 := substring(digits, q - 4, q);
TestPhone := init + prefix + "(" + Area + ") " + Num3 + break + Num4
end
end
end
end -
Sean, your code is very elegant, and I didn't realize while reading up on NX script that it accepted character class formatting via replacex and extractx commands... I'll have to keep tweaking
-
Art, The code accepts 10, 11 and 12 digit phone numbers and automatically adds "+" for 11 and 12 digit numbers. You could type "+" if you like, but it would be removed before the formatting took place. I didn't intend for it to be an end-all solution so feel free to modify it if you like. Another option would be to base the formatting on a country field.
extractx()
,replacex()
,splitx()
andtestx()
are functions that let you use regular expressions in Ninox. -
Thanks for the info. I'm very amateur at scripting/coding, but I'm finding NX really easy to use, and the application in general extremely useful for my purposes. I'm using this phone number script to get my feet wet before I actually import my full data and go live with my personal system. Thank you very much for the info, and I'm going to play around with your code and see what I can learn from it as well. I have a feeling I'm going to be using a lot of the functions that allow regular expressions in the future.
-
Halio, below is my latest code (with lots of ideas taken from Sean). It adds a
"+"
to any string of numbers over 10, adds the(###) ###-###
formatting to any string of 10+ numbers, and completes any string under 10 digits with"x"
as a placeholder for the last digits so you can quickly see that you are missing digits in the string. For you to have every number start with"+00"
, and not any other country code, this code would have to be changed to add in the zeros, which would then require a bit of tweaking to avoid adding them if they are already there.let sym := "+";
let pad := "x"
let digits := replacex(Phone, "\D", "g", "");
let ln := length(digits);
let pre := ln - 10;
let split := "(\d{" + pre + "})(\d{3})(\d{3})(\d)";
if pre < 1 then sym := "" else sym := sym end;
let format := sym + "$1 ($2) $3-$4";
if ln < 10 then
Phone := rpad(Phone, 10, pad)
else
Phone := replacex(digits, split, "", format)
end -
I put the symbol and padding variables at the top so you can change them without having to hunt through the code.
-
Looks like you're getting the hang of it Ben. You can omit
else sym := sym
sincesym
was already defined in the beginning. -
Oh, great ! Thanks for the tip. Slightly off topic, but related to the codes here: is it possible to make a reference like
let fieldname:= x
at the beginning and then useif y then x:=somestring
later on in the code. This way you could make a code that could be copied and pasted into other fields without having to go through and change the name in each instance, just once in the beginning. This is of course a full question in its own right, but it would actually apply to every one of the codes given here as a reply to the op
Content aside
- 4 yrs agoLast active
- 30Replies
- 8429Views