templates support
This commit is contained in:
129
Inspectron.Epson.Templates/Interpreter/FormatResolver.cs
Normal file
129
Inspectron.Epson.Templates/Interpreter/FormatResolver.cs
Normal file
@@ -0,0 +1,129 @@
|
||||
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()
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user