/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PdfEncoder.Infrastructure/Pipeline/ExtractedFieldFormatValidator.cs
85 строк
3 KB
IBS\NAfanasev
Field validation, integration tests, UI polish
06 июл 2026, 17:18
06 июл 2026, 17:18
0e936b0
Код
Авторство
О чём код?
using System.Globalization; using System.Text.RegularExpressions; namespace PdfEncoder.Infrastructure.Pipeline; /// <summary> /// Проверка форматов значений полей после LLM-extract (даты ISO 8601, числа). /// </summary> internal static partial class ExtractedFieldFormatValidator { private static readonly Regex DateKeyPattern = DateKeyRegex(); private static readonly Regex NumericKeyPattern = NumericKeyRegex(); /// <summary> /// Проверяет значение поля и возвращает предупреждения формата. /// </summary> /// <param name="key">Ключ поля.</param> /// <param name="value">Значение поля.</param> internal static IReadOnlyList<string> ValidateFieldFormat( string key, string? value) { if (string.IsNullOrWhiteSpace(value)) { return []; } if (IsDateKey(key) && !IsIso8601Date(value)) { return [$"field-format-invalid:{key}:expected-iso8601-date"]; } if (IsNumericKey(key) && !IsDecimalNumber(value)) { return [$"field-format-invalid:{key}:expected-decimal-number"]; } return []; } private static bool IsDateKey(string key) { return DateKeyPattern.IsMatch(key); } private static bool IsNumericKey(string key) { return NumericKeyPattern.IsMatch(key); } private static bool IsIso8601Date(string value) { return DateOnly.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.None, out _) || DateTime.TryParse( value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out _); } private static bool IsDecimalNumber(string value) { var normalized = value .Replace(" ", string.Empty, StringComparison.Ordinal) .Replace('\u00A0', ' ') .Trim(); if (normalized.EndsWith("RUB", StringComparison.OrdinalIgnoreCase)) { normalized = normalized[..^3].Trim(); } return decimal.TryParse( normalized, NumberStyles.Number | NumberStyles.AllowCurrencySymbol, CultureInfo.InvariantCulture, out _); } [GeneratedRegex("date", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)] private static partial Regex DateKeyRegex(); [GeneratedRegex("(amount|total|sum|balance|price|qty|quantity)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)] private static partial Regex NumericKeyRegex(); }