From 037094a928653ed27f1f9d5497f637af1c5380e0 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 10 Nov 2025 13:27:11 +0100 Subject: fix(parser): not parsing right number with 0 after dot --- example/input.txt | 2 +- lib/math/conversion.ex | 3 ++- lib/math/rational.ex | 8 ++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/example/input.txt b/example/input.txt index 909e250..9c49d56 100644 --- a/example/input.txt +++ b/example/input.txt @@ -1,4 +1,4 @@ -a = 10.5;; b = .5 +a = 10.05;; b = .95 (a + b) * 10 / 2 x = 2_0 diff --git a/lib/math/conversion.ex b/lib/math/conversion.ex index 65ddf8f..3dd777e 100644 --- a/lib/math/conversion.ex +++ b/lib/math/conversion.ex @@ -9,10 +9,11 @@ defmodule ElixirMathParser.Math.Conversion do if v != "." do num = Rational.numerator(acc) * 10 den = Rational.denominator(acc) * 10 - Rational.new(num + String.to_integer(v), den) + Rational.newRaw(num + String.to_integer(v), den) else acc end end) + |> Rational.simplify() end end diff --git a/lib/math/rational.ex b/lib/math/rational.ex index 018f69b..c3d94c9 100644 --- a/lib/math/rational.ex +++ b/lib/math/rational.ex @@ -132,6 +132,10 @@ defmodule ElixirMathParser.Math.Rational do div(numerator, %Rational{numerator: denominator, denominator: 1}) end + def newRaw(numerator, denominator) when is_integer(numerator) and is_integer(denominator) do + %Rational{numerator: numerator, denominator: denominator} + end + @doc """ Returns the absolute version of the given number (which might be an integer, float or Rational). @@ -424,9 +428,9 @@ defmodule ElixirMathParser.Math.Rational do # Simplifies the Rational to its most basic form. # Which might result in an integer. # Ensures that a `-` is only kept in the numerator. - defp simplify(rational) + def simplify(rational) - defp simplify(%Rational{numerator: numerator, denominator: denominator}) do + def simplify(%Rational{numerator: numerator, denominator: denominator}) do gcdiv = gcd(numerator, denominator) denominator = Kernel.div(denominator, gcdiv) -- cgit v1.2.3