Files
CutList/CutList.Core/Formatting/ArchUnits.cs
AJ Isaacs dfc767320a fix: Improve architectural unit parsing and formatting
- Add fallback to parse plain decimal inches without unit symbols
- Fix fraction-only display to show "1/2" instead of "0-1/2"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 23:37:15 -05:00

85 lines
2.5 KiB
C#

using System.Text;
using System.Text.RegularExpressions;
namespace CutList.Core.Formatting
{
public static class ArchUnits
{
public static double ParseToInches(string input)
{
if (string.IsNullOrWhiteSpace(input))
return 0;
var sb = new StringBuilder(input.Trim().ToLower());
// replace all units with their equivelant symbols
sb.Replace("ft", "'");
sb.Replace("feet", "'");
sb.Replace("foot", "'");
sb.Replace("inches", "\"");
sb.Replace("inch", "\"");
sb.Replace("in", "\"");
var regex = new Regex("^(?<Feet>\\d+\\.?\\d*\\s*')?\\s*(?<Inches>\\d+\\.?\\d*\\s*\")?$");
// input manipulation is done, put the value back
input = Fraction.ReplaceFractionsWithDecimals(sb.ToString());
var match2 = regex.Match(input);
if (!match2.Success)
{
// If no unit symbols, try to parse as plain inches (e.g., "0.5" or "1/2" converted to "0.5")
if (!input.Contains("'") && !input.Contains("\""))
{
if (double.TryParse(input.Trim(), out var plainInches))
{
return Math.Round(plainInches, 8);
}
}
throw new Exception("Input is not in a valid format.");
}
var feet = match2.Groups["Feet"];
var inches = match2.Groups["Inches"];
var totalInches = 0.0;
if (feet.Success)
{
var x = double.Parse(feet.Value.Remove(feet.Length - 1));
totalInches += x * 12;
}
if (inches.Success)
{
var x = double.Parse(inches.Value.Remove(inches.Length - 1));
totalInches += x;
}
return Math.Round(totalInches, 8);
}
public static double ParseToFeet(string input)
{
var inches = ParseToInches(input);
return Math.Round(inches / 12.0, 8);
}
public static string FormatFromInches(double totalInches)
{
var feet = Math.Floor(totalInches / 12.0);
var inches = FormatHelper.ConvertToMixedFraction(totalInches - (feet * 12.0));
if (feet > 0)
{
return $"{feet}' {inches}\"";
}
else
{
return $"{inches}\"";
}
}
}
}