Files
Print_server/Inspectron.Epson.Templates/Interpreter/FormatResolver.cs
2026-01-21 15:56:37 +01:00

130 lines
3.3 KiB
C#

using System.Globalization;
using System.Text.Json;
namespace Inspectron.Epson.Templates.Interpreter;
public class FormatResolver
{
private readonly CultureInfo _culture;
public FormatResolver(CultureInfo? culture = null)
{
_culture = culture ?? CultureInfo.InvariantCulture;
}
public string Format(JsonElement? element, string? format)
{
if (!element.HasValue || element.Value.ValueKind == JsonValueKind.Null)
{
return string.Empty;
}
var value = element.Value;
if (string.IsNullOrEmpty(format))
{
return GetDefaultString(value);
}
return value.ValueKind switch
{
JsonValueKind.Number => FormatNumber(value, format),
JsonValueKind.String => FormatString(value.GetString(), format),
_ => GetDefaultString(value)
};
}
private string FormatNumber(JsonElement value, string format)
{
// Try to get as decimal for precision
if (value.TryGetDecimal(out var decimalValue))
{
try
{
return decimalValue.ToString(format, _culture);
}
catch (FormatException)
{
return decimalValue.ToString(_culture);
}
}
if (value.TryGetDouble(out var doubleValue))
{
try
{
return doubleValue.ToString(format, _culture);
}
catch (FormatException)
{
return doubleValue.ToString(_culture);
}
}
return value.GetRawText();
}
private string FormatString(string? value, string format)
{
if (string.IsNullOrEmpty(value))
{
return string.Empty;
}
// Try to parse as DateTime
if (DateTime.TryParse(value, out var dateTime))
{
try
{
return dateTime.ToString(format, _culture);
}
catch (FormatException)
{
return value;
}
}
// Try to parse as DateTimeOffset (for ISO 8601 strings)
if (DateTimeOffset.TryParse(value, out var dateTimeOffset))
{
try
{
return dateTimeOffset.ToString(format, _culture);
}
catch (FormatException)
{
return value;
}
}
// If it's a number in string form
if (decimal.TryParse(value, out var decimalValue))
{
try
{
return decimalValue.ToString(format, _culture);
}
catch (FormatException)
{
return value;
}
}
return value;
}
private string GetDefaultString(JsonElement value)
{
return value.ValueKind switch
{
JsonValueKind.String => value.GetString() ?? string.Empty,
JsonValueKind.Number => value.GetRawText(),
JsonValueKind.True => "true",
JsonValueKind.False => "false",
JsonValueKind.Null => string.Empty,
JsonValueKind.Undefined => string.Empty,
_ => value.GetRawText()
};
}
}