Packages

A lightweight Elixir library for calculating GPA, CGPA, and SGPA. Supports 4.0 and 5.0 grading scales.

Current section

Files

Jump to
cgpa_calculator lib cgpa_calculator.ex
Raw

lib/cgpa_calculator.ex

defmodule CgpaCalculator do
@moduledoc """
A lightweight Elixir library for calculating GPA, CGPA, and SGPA.
Supports 4.0 and 5.0 grading scales.
Homepage: https://gpacalc.app
"""
@grade_points_4 %{
"A+" => 4.0, "A" => 4.0, "A-" => 3.7,
"B+" => 3.3, "B" => 3.0, "B-" => 2.7,
"C+" => 2.3, "C" => 2.0, "C-" => 1.7,
"D+" => 1.3, "D" => 1.0, "D-" => 0.7,
"F" => 0.0
}
@grade_points_5 %{
"A" => 5.0, "B" => 4.0, "C" => 3.0,
"D" => 2.0, "E" => 1.0, "F" => 0.0
}
@doc """
Calculate GPA for a list of courses.
## Examples
iex> CgpaCalculator.calculate_gpa([%{grade: "A", credits: 3}, %{grade: "B", credits: 3}])
3.5
"""
def calculate_gpa(courses, scale \\ 4.0) do
grade_map = if scale == 5.0, do: @grade_points_5, else: @grade_points_4
{total_points, total_credits} =
Enum.reduce(courses, {0.0, 0.0}, fn course, {pts, creds} ->
grade = String.upcase(to_string(course.grade))
credits = course.credits / 1
point = Map.fetch!(grade_map, grade)
{pts + point * credits, creds + credits}
end)
Float.round(total_points / total_credits, 2)
end
@doc """
Calculate cumulative GPA across semesters.
## Examples
iex> CgpaCalculator.calculate_cgpa([%{gpa: 3.5, credits: 15}, %{gpa: 3.8, credits: 16}])
3.66
"""
def calculate_cgpa(semesters) do
{total_points, total_credits} =
Enum.reduce(semesters, {0.0, 0.0}, fn sem, {pts, creds} ->
{pts + sem.gpa * sem.credits, creds + sem.credits}
end)
Float.round(total_points / total_credits, 2)
end
@doc """
Convert percentage to GPA on a 4.0 scale.
"""
def percentage_to_gpa(pct) when pct >= 93, do: 4.0
def percentage_to_gpa(pct) when pct >= 90, do: 3.7
def percentage_to_gpa(pct) when pct >= 87, do: 3.3
def percentage_to_gpa(pct) when pct >= 83, do: 3.0
def percentage_to_gpa(pct) when pct >= 80, do: 2.7
def percentage_to_gpa(pct) when pct >= 77, do: 2.3
def percentage_to_gpa(pct) when pct >= 73, do: 2.0
def percentage_to_gpa(pct) when pct >= 70, do: 1.7
def percentage_to_gpa(pct) when pct >= 67, do: 1.3
def percentage_to_gpa(pct) when pct >= 63, do: 1.0
def percentage_to_gpa(pct) when pct >= 60, do: 0.7
def percentage_to_gpa(_), do: 0.0
@doc """
Convert GPA to letter grade.
"""
def gpa_to_letter(gpa) when gpa >= 3.85, do: "A"
def gpa_to_letter(gpa) when gpa >= 3.5, do: "A-"
def gpa_to_letter(gpa) when gpa >= 3.15, do: "B+"
def gpa_to_letter(gpa) when gpa >= 2.85, do: "B"
def gpa_to_letter(gpa) when gpa >= 2.5, do: "B-"
def gpa_to_letter(gpa) when gpa >= 2.15, do: "C+"
def gpa_to_letter(gpa) when gpa >= 1.85, do: "C"
def gpa_to_letter(gpa) when gpa >= 1.5, do: "C-"
def gpa_to_letter(gpa) when gpa >= 1.15, do: "D+"
def gpa_to_letter(gpa) when gpa >= 0.85, do: "D"
def gpa_to_letter(gpa) when gpa >= 0.5, do: "D-"
def gpa_to_letter(_), do: "F"
end