diff --git a/src/main/java/com/thealgorithms/conversions/TemperatureConverter.java b/src/main/java/com/thealgorithms/conversions/TemperatureConverter.java new file mode 100644 index 000000000000..70af50bdea96 --- /dev/null +++ b/src/main/java/com/thealgorithms/conversions/TemperatureConverter.java @@ -0,0 +1,140 @@ +package com.thealgorithms.conversions; + +/** + * Utility class for converting temperatures between Celsius, Fahrenheit, and Kelvin. + * + *

Formulas reference: + * ... + *

Note: Some of the formulas presented on the wikipedia page are not correct + * + *

Examples: + *

+ */ +public final class TemperatureConverter { + + private TemperatureConverter() { + } + + /** + * Converts Celsius to Fahrenheit. + * Formula: °C × 9/5 + 32 + */ + public static Double celsiusToFahrenheit(Double celsius) { + if (celsius < -273.15) { + throw new IllegalArgumentException("Temperature below absolute zero (-273.15°C)."); + } + return (celsius * 1.8) + 32; + } + + public static String celsiusToFahrenheit(String celsius) { + String[] temp = celsius.replace("°C", "").trim().split(" "); + double value = Double.parseDouble(temp[0]); + if (value < -273.15) { + throw new IllegalArgumentException("Temperature below absolute zero (-273.15°C)."); + } + return ((value * 1.8) + 32) + "°F"; + } + + /** + * Converts Celsius to Kelvin. + * Formula: °C + 273.15 + */ + public static Double celsiusToKelvin(Double celsius) { + if (celsius < -273.15) { + throw new IllegalArgumentException("Temperature below absolute zero (-273.15°C)."); + } + return celsius + 273.15; + } + + public static String celsiusToKelvin(String celsius) { + String[] temp = celsius.replace("°C", "").trim().split(" "); + double value = Double.parseDouble(temp[0]); + if (value < -273.15) { + throw new IllegalArgumentException("Temperature below absolute zero (-273.15°C)."); + } + return (value + 273.15) + " K"; + } + + /** + * Converts: Fahrenheit to Celsius. + * Formula: (°F - 32) * 5/9 + */ + public static Double fahrenheitToCelsius(Double fahrenheit) { + if (fahrenheit < -459.67) { + throw new IllegalArgumentException("Temperature below absolute zero (-459.67°F)."); + } + return (fahrenheit - 32) * (5.0 / 9.0); + } + + public static String fahrenheitToCelsius(String fahrenheit) { + String[] temp = fahrenheit.replace("°F", "").trim().split(" "); + double value = Double.parseDouble(temp[0]); + if (value < -459.67) { + throw new IllegalArgumentException("Temperature below absolute zero (-459.67°F)."); + } + return ((value - 32) * (5.0 / 9.0)) + "°C"; + } + + /** + * Converts: Fahrenheit to Kelvin. + * Formula: (°F - 32) * 5/9 + 273.15 + */ + public static Double fahrenheitToKelvin(Double fahrenheit) { + if (fahrenheit < -459.67) { + throw new IllegalArgumentException("Temperature below absolute zero (-459.67°F)."); + } + return (fahrenheit - 32) * (5.0 / 9.0) + 273.15; + } + + public static String fahrenheitToKelvin(String fahrenheit) { + String[] temp = fahrenheit.replace("°F", "").trim().split(" "); + double value = Double.parseDouble(temp[0]); + if (value < -459.67) { + throw new IllegalArgumentException("Temperature below absolute zero (-459.67°F)."); + } + return ((value - 32) * (5.0 / 9.0) + 273.15) + " K"; + } + + /** + * Converts: Kelvin to Celsius. + * Formula: K - 273.15 + */ + public static Double kelvinToCelsius(Double kelvin) { + if (kelvin < 0) { + throw new IllegalArgumentException("Temperature below absolute zero (0 K)."); + } + return kelvin - 273.15; + } + + public static String kelvinToCelsius(String kelvin) { + String[] temp = kelvin.replace("K", "").trim().split(" "); + double value = Double.parseDouble(temp[0]); + if (value < 0) { + throw new IllegalArgumentException("Temperature below absolute zero (0 K)."); + } + return (value - 273.15) + "°C"; + } + + /** + * Converts: Kelvin to Fahrenheit. + * Formula: (K - 273.15) * 9/5 + 32 + */ + public static Double kelvinToFahrenheit(Double kelvin) { + if (kelvin < 0) { + throw new IllegalArgumentException("Temperature below absolute zero (0 K)."); + } + return 1.8 * (kelvin - 273.15) + 32; + } + + public static String kelvinToFahrenheit(String kelvin) { + String[] temp = kelvin.replace("K", "").trim().split(" "); + double value = Double.parseDouble(temp[0]); + if (value < 0) { + throw new IllegalArgumentException("Temperature below absolute zero (0 K)."); + } + return (1.8 * (value - 273.15) + 32) + "°F"; + } +} diff --git a/src/test/java/com/thealgorithms/conversions/TemperatureConverterTest.java b/src/test/java/com/thealgorithms/conversions/TemperatureConverterTest.java new file mode 100644 index 000000000000..f90891b542c2 --- /dev/null +++ b/src/test/java/com/thealgorithms/conversions/TemperatureConverterTest.java @@ -0,0 +1,79 @@ +package com.thealgorithms.conversions; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +public class TemperatureConverterTest { + + @Test + public void testValidCelsiusToFahrenheit() { + assertEquals(33.8, TemperatureConverter.celsiusToFahrenheit(1.0)); + assertEquals(34.718, TemperatureConverter.celsiusToFahrenheit(1.51)); + assertEquals(14.0, TemperatureConverter.celsiusToFahrenheit(-10.0)); + assertEquals("33.8°F", TemperatureConverter.celsiusToFahrenheit("1°C")); + assertEquals("34.718°F", TemperatureConverter.celsiusToFahrenheit("1.51°C")); + assertEquals("14.0°F", TemperatureConverter.celsiusToFahrenheit("-10.0°C")); + } + + @Test + public void testValidCelsiusToKevin() { + assertEquals(274.15, TemperatureConverter.celsiusToKelvin(1.0)); + assertEquals(274.65999999999997, TemperatureConverter.celsiusToKelvin(1.51)); + assertEquals(263.15, TemperatureConverter.celsiusToKelvin(-10.0)); + assertEquals("274.15 K", TemperatureConverter.celsiusToKelvin("1°C")); + assertEquals("274.65999999999997 K", TemperatureConverter.celsiusToKelvin("1.51°C")); + assertEquals("263.15 K", TemperatureConverter.celsiusToKelvin("-10.0°C")); + } + + @Test + public void testValidFahrenheitToCelsius() { + assertEquals(-17.22222222222222, TemperatureConverter.fahrenheitToCelsius(1.0)); + assertEquals(65.55555555555556, TemperatureConverter.fahrenheitToCelsius(150.0)); + assertEquals(-23.333333333333336, TemperatureConverter.fahrenheitToCelsius(-10.0)); + assertEquals("-17.22222222222222°C", TemperatureConverter.fahrenheitToCelsius("1°F")); + assertEquals("65.55555555555556°C", TemperatureConverter.fahrenheitToCelsius("150.0°F")); + assertEquals("-23.333333333333336°C", TemperatureConverter.fahrenheitToCelsius("-10.0°F")); + } + + @Test + public void testValidFahrenheitToKelvin() { + assertEquals(255.92777777777775, TemperatureConverter.fahrenheitToKelvin(1.0)); + assertEquals(328.7055555555555, TemperatureConverter.fahrenheitToKelvin(132.0)); + assertEquals(249.81666666666663, TemperatureConverter.fahrenheitToKelvin(-10.0)); + assertEquals("255.92777777777775 K", TemperatureConverter.fahrenheitToKelvin("1°F")); + assertEquals("328.7055555555555 K", TemperatureConverter.fahrenheitToKelvin("132°F")); + assertEquals("249.81666666666663 K", TemperatureConverter.fahrenheitToKelvin("-10.0°F")); + } + + @Test + public void testValidKelvinToCelsius() { + assertEquals(-272.15, TemperatureConverter.kelvinToCelsius(1.0)); + assertEquals(-141.14999999999998, TemperatureConverter.kelvinToCelsius(132.0)); + assertEquals(-263.15, TemperatureConverter.kelvinToCelsius(10.0)); + assertEquals("-272.15°C", TemperatureConverter.kelvinToCelsius("1.0 K")); + assertEquals("-141.14999999999998°C", TemperatureConverter.kelvinToCelsius("132.0 K")); + assertEquals("-263.15°C", TemperatureConverter.kelvinToCelsius("10.0 K")); + } + + @Test + public void testValidKelvinToFahrenheit() { + assertEquals(-457.86999999999995, TemperatureConverter.kelvinToFahrenheit(1.0)); + assertEquals(-222.06999999999996, TemperatureConverter.kelvinToFahrenheit(132.0)); + assertEquals(-441.66999999999996, TemperatureConverter.kelvinToFahrenheit(10.0)); + assertEquals("-457.86999999999995°F", TemperatureConverter.kelvinToFahrenheit("1.0 K")); + assertEquals("-222.06999999999996°F", TemperatureConverter.kelvinToFahrenheit("132.0 K")); + assertEquals("-441.66999999999996°F", TemperatureConverter.kelvinToFahrenheit("10.0 K")); + } + + @Test + public void testAbsoluteZeroAndBelow() { + assertThrows(IllegalArgumentException.class, () -> TemperatureConverter.celsiusToFahrenheit(-300.0)); + assertThrows(IllegalArgumentException.class, () -> TemperatureConverter.celsiusToKelvin("-300°C")); + assertThrows(IllegalArgumentException.class, () -> TemperatureConverter.fahrenheitToCelsius(-500.0)); + assertThrows(IllegalArgumentException.class, () -> TemperatureConverter.fahrenheitToKelvin("-500°F")); + assertThrows(IllegalArgumentException.class, () -> TemperatureConverter.kelvinToCelsius(-1.0)); + assertThrows(IllegalArgumentException.class, () -> TemperatureConverter.kelvinToFahrenheit("-1 K")); + } +}