AppleScript Guidebook: Essential Sub-Routines

Number to Text Routines

Scripts often convert numeric data to text data in order to display information to the user. Most of the time this conversion can be accomplished simply by using a coercion handler as in the following example:

12 as string
--> Returns: "12"

However, some numeric values are displayed in scientific notation. For example, 1234000000 is displayed by a script as 1.234E+9

When this value is coerced to text it becomes: "1.234E+9"

The following sub-routine will convert any number to a string of numeric characters. This sub-routine is used by the other sub-routines on this page which also manipulate numeric data.


Number to String

An easy-to-use sub-routine, just pass the number to convert to text as the passed parameter value in the sub-routine call.

number_to_text(8.72124243234E+11)
--> "872124243234"


on number_to_text(this_number)
set this_number to this_number as text
if this_number contains "E+" then
set x to the offset of "." in this_number
set y to the offset of "+" in this_number
set z to the offset of "E" in this_number
set the decimal_adjust to characters (y - (length of this_number)) thru ¬
-1 of this_number as string as number
if x is not 0 then
set the first_part to characters 1 thru (x - 1) of this_number as string
else
set the first_part to ""
end if
set the second_part to characters (x + 1) thru (z - 1) of this_number as string
set the converted_number to the first_part
repeat with i from 1 to the decimal_adjust
try
set the converted_number to ¬
the converted_number & character i of the second_part
on error
set the converted_number to the converted_number & "0"
end try
end repeat
return the converted_number
else
return this_number
end if
end number_to_text


Comma Delimit Number

This sub-routine will comma delimit a numeric value and convert it to text.

NOTE: this sub-routine uses the number_to_text() sub-routine. Be sure to add it to your script as well.

comma_delimit(872124243234)
--> "872,124,243,234"


on comma_delimit(this_number)
set this_number to this_number as text
if this_number contains "E" then ¬
set this_number to number_to_text(this_number)
set the num_length to the length of this_number
set the this_number to ¬
(the reverse of every character of this_number) as string
set the new_num to ""
repeat with i from 1 to the num_length
if i is the num_length or (i mod 3) is not 0 then
set the new_num to ¬
(character i of this_number & the new_num) as string
else
set the new_num to ¬
("," & character i of this_number & the new_num) as string
end if
end repeat
return the new_num
end comma_delimit


Round and Truncate

This sub-routine will round and truncate a numeric value and convert it to text. To use, pass the numeric value and the number of desired decimal places as the passed parameters.

NOTE: this sub-routine uses the number_to_text() sub-routine. Be sure to add it to your script as well.

round_truncate(1.04575, 3)
--> "1.046"


on round_truncate(this_number, decimal_places)
if decimal_places is 0 then
set this_number to this_number + 0.5
return number_to_text(this_number div 1)
end if

set the rounding_value to "5"
repeat decimal_places times
set the rounding_value to "0" & the rounding_value
end repeat
set the rounding_value to ("." & the rounding_value) as number

set this_number to this_number + rounding_value

set the mod_value to "1"
repeat decimal_places - 1 times
set the mod_value to "0" & the mod_value
end repeat
set the mod_value to ("." & the mod_value) as number

set second_part to (this_number mod 1) div the mod_value
if the length of (the second_part as text) is less than the ¬
decimal_places then
repeat decimal_places - ¬
(the length of (the second_part as text)) times
set second_part to ("0" & second_part) as string
end repeat
end if

set first_part to this_number div 1
set first_part to number_to_text(first_part)
set this_number to (first_part & "." & second_part)

return this_number
end round_truncate


Adding Descriptive Suffix

The following sub-routine will add "st", "nd", "rd", or "th" to the end of a number.


on add_numeric_suffix(this_num)
set the list_index to (this_num mod 10) + 1
set the num_suffix to item list_index of ¬
{"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"}
return ((this_num as text) & the num_suffix)
end add_numeric_suffix

add_numeric_suffix(24)
--> "24th"


set this_list to {"Sal", "Carl", "Bob", "Sue", "Wanda"}
repeat with i from 1 to the count of this_list
display dialog "The " & add_numeric_suffix(i) & ¬
" person in the list is " & (item i of this_list) & "."
end repeat


Adding Leading Zeros

The following sub-routine will place leading zeros (0001, 023, etc.) before a number.

There are two passed paramters: the number to add leading zeros to, and the maximum number of leading zeros to add.

For example, if the maximum number of leading zeros is set to 2, then the results will range from 001 to 999. If the maximum number of leading zeros is 3, then the results will range from 0001 to 9999, and so on.


on add_leading_zeros(this_number, max_leading_zeros)
set the threshold_number to (10 ^ max_leading_zeros) as integer
if this_number is less than the threshold_number then
set the leading_zeros to ""
set the digit_count to the length of ((this_number div 1) as string)
set the character_count to (max_leading_zeros + 1) - digit_count
repeat character_count times
set the leading_zeros to (the leading_zeros & "0") as string
end repeat
return (leading_zeros & (this_number as text)) as string
else
return this_number as text
end if
end add_leading_zeros