.NET Fiddle

FSharp · Script

/Program.fs

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"


;