fix: preserve legacy settings decimal semantics

This commit is contained in:
codex
2026-08-10 15:42:18 +03:00
parent eb70c9d1a1
commit f706840d5d
2 changed files with 14 additions and 1 deletions
@@ -37,7 +37,7 @@ public sealed record ProductionSettingsContract(
var setLayer = root.Element("SetLayer")?.Attribute("name")?.Value;
if (string.IsNullOrWhiteSpace(setLayer)) throw Invalid("SetLayer.name");
var plusLength = root.Element("PlusLengthNO")?.Attribute("value")?.Value;
double? parsedPlusLength = double.TryParse(plusLength, NumberStyles.Float, CultureInfo.InvariantCulture, out var plus) ? plus : null;
double? parsedPlusLength = TryParseLegacyNumber(plusLength, out var plus) ? plus : null;
return new(
copy,
layers,
@@ -55,6 +55,11 @@ public sealed record ProductionSettingsContract(
}
private static int? ParseInt(XElement value, string name) => int.TryParse(value.Attribute(name)?.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed) ? parsed : null;
private static bool TryParseLegacyNumber(string? value, out double parsed)
{
if (double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out parsed)) return true;
return double.TryParse(value?.Replace(',', '.'), NumberStyles.Float, CultureInfo.InvariantCulture, out parsed);
}
private static string Required(XElement? value, string name, bool allowEmpty = false) => value?.Attribute(name) is { Value: var result } && (allowEmpty || !string.IsNullOrWhiteSpace(result)) ? result : throw Invalid(name);
private static InvalidDataException Invalid(string field) => new("PRODUCTION_SETTINGS_INVALID:" + field);
}
@@ -35,4 +35,12 @@ public sealed class ProductionSettingsContractTests
var exception = Assert.Throws<InvalidDataException>(() => ProductionSettingsContract.Parse(xml));
Assert.Equal("PRODUCTION_SETTINGS_INVALID:layer", exception.Message);
}
[Fact]
public void ParsesLegacyCommaDecimalPlusLength()
{
const string xml = "<Main><CopyMissingObjects/><LayersSetup/><Annotations layer='TEXT' textstyle='GOSTC' multileaderstyle='PXP'/><LinenumberConnections polylinelayer='AXIS' textlayer='TEXT' textstyle='GOSTC'/><Elevations layer='THIN' textstyle='GOSTC'/><SetLayer name='AXIS'/><PlusLengthNO value='1,5'/></Main>";
var result = ProductionSettingsContract.Parse(xml);
Assert.Equal(1.5, result.FixedSupportPlusLength);
}
}