Fahrenheit to Celsius, Celsius to Fahrenheit

Just a little temperature converter that works both ways. Lightweight, simple and fast.

set fDeg to false
set cDeg to false
set prompt1 to "Enter Any Number:"
set title1 to "Farenheit/Celsius Converter"

repeat
	repeat
		set degree to text returned of (display dialog prompt1 default answer "" with title title1 buttons {"Quit", "Convert"} default button 2 cancel button "Quit")
		try
			set degree to degree as number
		end try
		if class of degree is not text then exit repeat
		display dialog "You must enter a number." buttons {"OK"} default button 1 giving up after 2
	end repeat
	
	
	set cDeg to (degree - 32) * 5 / 9
	set cDeg to (round (cDeg * 100)) / 100
	set fDeg to 9 / 5 * degree + 32
	set fDeg to (round (fDeg * 100)) / 100
	
	
	set prompt1 to ("Farenheit to Celsius:
" & degree & "° F   =   " & (cDeg as string) & "° C

Celsius to Farenheit:
" & degree & "° C   =   " & fDeg & "° F

Enter Any Number:") as string
end repeat


Here’s my version from some years ago:


repeat
	tell application "System Events"
		activate
		set degrees to text returned of (display dialog "Enter a number and append C or F to set the units of the number entered. The result will be in the alternative units." default answer "")
	end tell
	set ans to true
	if "c" is in degrees then
		set O to offset of "c" in degrees
		set degrees to (text 1 thru (O - 1) of degrees) as real
		set conversion to "" & degrees & "°C is " & C_to_F(degrees) & "°F"
	else if "f" is in degrees then
		set O to offset of "f" in degrees
		set degrees to (text 1 thru (O - 1) of degrees) as real
		set conversion to "" & degrees & "°F is " & F_to_C(degrees) & "°C"
	else
		tell application "System Events"
			activate
			display dialog "Please enter a temperature unit: C or F after the number with or without a space."
		end tell
		set ans to false
	end if
	if ans then
		tell application "System Events"
			activate
			if button returned of (display dialog conversion buttons {"Quit", "Again"} default button 1 with title "Temperature Scale Conversion") is "Quit" then exit repeat
		end tell
	end if
end repeat

to C_to_F(d)
	return my oneD(((d * 9 / 5) + 32)) as text
end C_to_F

to F_to_C(d)
	return my oneD(5 * (d - 32) / 9) as text
end F_to_C

to oneD(N)
	return ((100 * N) div 1) / 100
end oneD

Just for completeness, i suppose i should point out that AppleScript has built-in coercions which can do the calculations for you:

set cDeg to degree as degrees Fahrenheit as degrees Celsius as number
set fDeg to degree as degrees Celsius as degrees Fahrenheit as number

” although if you know the math, that’s actually more efficient! :slight_smile:

Conversely, coercing a number to integer is a faster way of rounding it than using the ‘round’ function:

set cDeg to (degree - 32) * 5 / 9
set cDeg to (cDeg * 100) as integer/ 100
set fDeg to 9 / 5 * degree + 32
set fDeg to (fDeg * 100) as integer/ 100

-- Or:
set cDeg to ((degree - 32) * 55.555555555556 as integer) / 100
set fDeg to ((180 * degree + 3200) as integer) / 100

Edit: Script typo corrected. :rolleyes:

Interesting, thanks for the tips and info.

In Adam’s script, is there a reason to call on System Events when using display dialog? I never heard of doing that before. Can anyone explain?

If you activate System Events before posting the dialog it will always appear in front of everything else. Otherwise it can pop up behind another open window.

Wow, that is tremendously helpful, thank you.