fix: preserve legacy settings decimal semantics
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user