FSharp · Script
open System
//Source 1: http://msdn.microsoft.com/en-us/library/dd233243.aspx
//Source 2: http://rosettacode.org/wiki/Temperature_conversion#F.23
[<Measure>] type degC // temperature, Celsius/Centigrade
[<Measure>] type degF // temperature, Fahrenheit
[<Measure>] type degK // temperature, Kelvin
//------------------
//Conversion methods
let convertCtoF ( temp: float<degC> ) = (9.0 / 5.0 * (float temp) + 32.0) * 1.0<degF>
let convertCtoK ( temp: float<degC> ) = (float temp + 273.15) * 1.0<degK>
let convertFtoC ( temp: float<degF> ) = 5.0 / 9.0 * (float temp - 32.0) * 1.0<degC>
let convertFtoK ( temp: float<degF> ) = convertCtoK (convertFtoC (temp))
let convertKtoC ( temp : float<degK>) = (float temp - 273.15) * 1.0<degC>
let convertKtoF ( temp : float<degK>) = convertCtoF (convertKtoC (temp))
// Define conversion functions from dimensionless floating point values.
let degreesFahrenheit temp = temp * 1.0<degF>
let degreesCelsius temp = temp * 1.0<degC>
let degreesKelvin temp = temp * 1.0<degK>
//--------------------
//Displaying conversion results
let doConversion (suffix:char, inputDegrees:float) =
//let inputDegreesMeasure= inputDegrees * (1.0<degC/degF>)
match suffix with
| 'C' ->
printfn "%8.2fF" ((convertCtoF (degreesCelsius inputDegrees))/(1.0<degF>))
printfn "%8.2fK" ((convertCtoK (degreesCelsius inputDegrees))/(1.0<degK>))
| 'F' ->
printfn "%8.2fC" ((convertFtoC (degreesFahrenheit inputDegrees))/(1.0<degC>))
printfn "%8.2fK" ((convertFtoK (degreesFahrenheit inputDegrees))/(1.0<degK>))
| 'K' ->
printfn "%8.2fC" ((convertKtoC (degreesKelvin inputDegrees))/(1.0<degC>))
printfn "%8.2fF" ((convertKtoF (degreesKelvin inputDegrees))/(1.0<degF>))
| _ ->
printfn "Suffix is not valid"
//---------------------
// Console input and handling invalid input
while true do
printfn "Enter a temperature in degrees followed by (C, F, K):"
let input = System.Console.ReadLine()
let mutable inputDegrees = 0.
if not (String.IsNullOrWhiteSpace(input)) then
let suffix = input.[input.Length-1]
let tryParse = System.Double.TryParse(input.Remove(input.Length-1), &inputDegrees)
if tryParse then
doConversion(suffix, inputDegrees)
else
printfn "Degrees value is not valid"
else
printfn "Suffix is not valid"