From 4b1ed647516afc2e9cbca68e2099f928fb06bca6 Mon Sep 17 00:00:00 2001 From: textGamex Date: Wed, 15 Apr 2026 18:16:47 +0800 Subject: [PATCH] perf: optimize NumberBoxParser.GetNextNumber performance --- .../UI/Controls/NumberBox/NumberBoxParser.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/FluentAvalonia/UI/Controls/NumberBox/NumberBoxParser.cs b/src/FluentAvalonia/UI/Controls/NumberBox/NumberBoxParser.cs index 7fce3d28..6d383380 100644 --- a/src/FluentAvalonia/UI/Controls/NumberBox/NumberBoxParser.cs +++ b/src/FluentAvalonia/UI/Controls/NumberBox/NumberBoxParser.cs @@ -3,7 +3,7 @@ using System.Text.RegularExpressions; namespace FluentAvalonia.UI.Controls; -internal static class NumberBoxParser +internal static partial class NumberBoxParser { public const string numberBoxOperators = "+-*/^"; @@ -65,18 +65,15 @@ internal static class NumberBoxParser return tokens; } - public static (double value, int charLen) GetNextNumber(ReadOnlySpan inputSpan) + public static (double value, int charLen) GetNextNumber(ReadOnlySpan input) { //TODO: Remove Regex impl (even tho this was copied from WinUI) - string input = inputSpan.ToString(); - Regex rg = new Regex("^-?([^-+/*\\(\\)\\^\\s]+)"); - var match = rg.Match(input); - if (match.Success) + var match = NumberRegex().EnumerateMatches(input); + if (match.MoveNext()) { // Might be a number - var matchLength = match.Value.Length; - //var parsedNum = parser.ParseDouble(input.Substring(0, matchLength)); - if (double.TryParse(input.Substring(0, matchLength), System.Globalization.NumberStyles.Any, CultureInfo.CurrentCulture, out double result)) + var matchLength = match.Current.Length; + if (double.TryParse(input[..matchLength], NumberStyles.Any, CultureInfo.CurrentCulture, out double result)) { return (result, matchLength); } @@ -255,6 +252,8 @@ internal static class NumberBoxParser return null; } + [GeneratedRegex(@"^-?([^-+/*\(\)\^\s]+)")] + private static partial Regex NumberRegex(); } internal enum MathTokenType