From 3ff67cfd7b0353bb01a2844c6596ad6a1bf24a5c Mon Sep 17 00:00:00 2001 From: disarray2077 <86157825+disarray2077@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:15:57 -0300 Subject: [PATCH 1/3] Improve `Float.Parse` --- BeefLibs/corlib/src/Float.bf | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/BeefLibs/corlib/src/Float.bf b/BeefLibs/corlib/src/Float.bf index b8e1dd9a..6b38519f 100644 --- a/BeefLibs/corlib/src/Float.bf +++ b/BeefLibs/corlib/src/Float.bf @@ -166,12 +166,29 @@ namespace System public static Result Parse(StringView val) { - bool isNeg = false; - double result = 0; + return Parse(val, NumberFormatInfo.CurrentInfo); + } + + public static Result Parse(StringView val, NumberFormatInfo info) + { + if (val.IsEmpty) + return .Err; + + bool isNeg = val[0] == '-'; + bool isPos = val[0] == '+'; + int32 offset = isNeg || isPos ? 1 : 0; + double result = 0; double decimalMultiplier = 0; - + + if (val.Equals(info.NegativeInfinitySymbol, true)) + return NegativeInfinity; + else if (val.Substring(offset).Equals(info.PositiveInfinitySymbol, true)) + return PositiveInfinity; + else if (val.Substring(offset).Equals(info.NaNSymbol, true)) + return NaN; + //TODO: Use Number.ParseNumber - for (int32 i = 0; i < val.Length; i++) + for (int32 i = offset; i < val.Length - offset; i++) { char8 c = val.Ptr[i]; @@ -186,7 +203,7 @@ namespace System break; } - if (c == '.') + if (c == info.NumberDecimalSeparator[0]) { if (decimalMultiplier != 0) return .Err; @@ -207,12 +224,6 @@ namespace System continue; } - if ((i == 0) && (c == '-')) - { - isNeg = true; - continue; - } - if ((c >= '0') && (c <= '9')) { result *= 10; From d0673115d0cec0f2e2e60232303693b4e17e0d6a Mon Sep 17 00:00:00 2001 From: disarray2077 <86157825+disarray2077@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:27:26 -0300 Subject: [PATCH 2/3] Use `RemoveFromStart` in `Float.Parse` --- BeefLibs/corlib/src/Float.bf | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/BeefLibs/corlib/src/Float.bf b/BeefLibs/corlib/src/Float.bf index 6b38519f..b20e0797 100644 --- a/BeefLibs/corlib/src/Float.bf +++ b/BeefLibs/corlib/src/Float.bf @@ -180,15 +180,18 @@ namespace System double result = 0; double decimalMultiplier = 0; - if (val.Equals(info.NegativeInfinitySymbol, true)) + var val; + val.RemoveFromStart(offset); + + if (@val.Equals(info.NegativeInfinitySymbol, true)) return NegativeInfinity; - else if (val.Substring(offset).Equals(info.PositiveInfinitySymbol, true)) + else if (val.Equals(info.PositiveInfinitySymbol, true)) return PositiveInfinity; - else if (val.Substring(offset).Equals(info.NaNSymbol, true)) + else if (val.Equals(info.NaNSymbol, true)) return NaN; //TODO: Use Number.ParseNumber - for (int32 i = offset; i < val.Length - offset; i++) + for (int32 i = 0; i < val.Length; i++) { char8 c = val.Ptr[i]; From 9779e284fb42e0bb87e448636ae68a59512fe19d Mon Sep 17 00:00:00 2001 From: disarray2077 <86157825+disarray2077@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:30:11 -0300 Subject: [PATCH 3/3] Remove unnecessary `offset` variable in `Float.Parse` --- BeefLibs/corlib/src/Float.bf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BeefLibs/corlib/src/Float.bf b/BeefLibs/corlib/src/Float.bf index b20e0797..ef901df2 100644 --- a/BeefLibs/corlib/src/Float.bf +++ b/BeefLibs/corlib/src/Float.bf @@ -176,12 +176,12 @@ namespace System bool isNeg = val[0] == '-'; bool isPos = val[0] == '+'; - int32 offset = isNeg || isPos ? 1 : 0; double result = 0; double decimalMultiplier = 0; var val; - val.RemoveFromStart(offset); + if (isNeg || isPos) + val.RemoveFromStart(1); if (@val.Equals(info.NegativeInfinitySymbol, true)) return NegativeInfinity;