SeibroFieldParse.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System.Globalization;
  2. namespace Infrastructure.StockData;
  3. /// <summary>
  4. /// SEIBro 파서 공용 필드 변환 헬퍼 — 순수 C#. YYYYMMDD→DateOnly, 콤마 포함 숫자→decimal/long/int, Y/N→bool.
  5. /// 값 없음/""/비형식 = null (SeibroXml 이 빈 value 를 이미 키 제외 처리하므로 여기 들어오는 raw 는 대개 비어있지 않지만 방어적으로 처리).
  6. /// Wave 0 파서들(SeibroStkStatParser 등)의 로컬 헬퍼와 동일 규칙을 한 곳에 모아 Wave 1+ 파서가 재사용한다.
  7. /// </summary>
  8. internal static class SeibroFieldParse
  9. {
  10. /// <summary>YYYYMMDD 8자리 → DateOnly. 그 외(빈값/형식 불일치)는 null.</summary>
  11. public static DateOnly? Date(string? raw)
  12. {
  13. var value = raw?.Trim();
  14. if (string.IsNullOrEmpty(value) || value.Length != 8)
  15. {
  16. return null;
  17. }
  18. return DateOnly.TryParseExact(value, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var date) ? date : null;
  19. }
  20. /// <summary>콤마 제거 후 decimal. 빈값/비숫자는 null (0 과 구분).</summary>
  21. public static decimal? Decimal(string? raw)
  22. {
  23. var value = raw?.Replace(",", string.Empty, StringComparison.Ordinal);
  24. return decimal.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsed) ? parsed : null;
  25. }
  26. public static int? Int(string? raw)
  27. {
  28. var value = raw?.Replace(",", string.Empty, StringComparison.Ordinal);
  29. return int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed) ? parsed : null;
  30. }
  31. /// <summary>NUMBER(15,4) 등 소수 표기 정수 → long (decimal 로 읽고 절사). 빈값/비숫자는 null.</summary>
  32. public static long? Long(string? raw)
  33. {
  34. var value = raw?.Replace(",", string.Empty, StringComparison.Ordinal);
  35. return decimal.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsed) ? (long)parsed : null;
  36. }
  37. /// <summary>Y→true, N→false, 그 외(빈값/미제공)→null.</summary>
  38. public static bool? Yn(string? raw)
  39. {
  40. return raw?.Trim().ToUpperInvariant() switch
  41. {
  42. "Y" => true,
  43. "N" => false,
  44. _ => null
  45. };
  46. }
  47. }