Number to Text Manipulations
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 the coercion handler as, like 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_string(8.72124243234E+11)
--> returns: "872124243234"
Here's the sub-routine:
on number_to_string(this_number)
set this_number to this_number as string
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_string
Comma Delimit a Number
This sub-routine will comma delimit a numeric value and convert it to text.
comma_delimit(872124243234)
--> returns: "872,124,243,234"
NOTE: this sub-routine uses the number_to_sring() sub-routine shown above. Be sure to add it to your script as well.
Here's the sub-routine:
on comma_delimit(this_number)
set this_number to this_number as string
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.
round_truncate(1.04575, 3)
--> returns: "1.046"
NOTE: this sub-routine uses the number_to_sring() sub-routine shown above. Be sure to add it to your script as well.
Here's the sub-routine:
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.
add_numeric_suffix(24)
--> returns: "24th"
Here's the sub-routine:
on add_numeric_suffix(this_num)
set this_num to this_num as string
if this_num ends with "11" or this_num ends with "12" or this_num ends with "13" then
set the list_index to 1
else
set the list_index to (this_num mod 10) + 1
end if
set the num_suffix to item list_index of {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"}
return (this_num & num_suffix)
end add_numeric_suffix
Here's an example script using the sub-routine:
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 parameters: 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