TimeSpanFormatter.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Text;
  3. using VCommon.Reflection;
  4. namespace VCommon
  5. {
  6. [Flags]
  7. public enum TimeSpanPart //TODO: TimeSpanPart I18N
  8. {
  9. [EnumMeta("")]
  10. None = 0,
  11. [EnumMeta("")]
  12. Default = Days | Hours | Minutes | Seconds,
  13. [EnumMeta("")]
  14. Full = Days | Hours | Minutes | Seconds | Milliseconds,
  15. [EnumMeta("天")]
  16. Days = 1 << 0,
  17. [EnumMeta("小时")]
  18. Hours = 1 << 1,
  19. [EnumMeta("分钟")]
  20. Minutes = 1 << 2,
  21. [EnumMeta("秒")]
  22. Seconds = 1 << 3,
  23. [EnumMeta("毫秒")]
  24. Milliseconds = 1 << 4,
  25. }
  26. public static class TimeSpanFormatter
  27. {
  28. private static string FormatNumber(int value, TimeSpanPart part)
  29. {
  30. return value + EnumMeta<TimeSpanPart>.Meta[part].Text; //TODO: I18N: value > 1 add `s' suffix
  31. }
  32. public static string ToReadableString(this TimeSpan me, TimeSpanPart parts = TimeSpanPart.Default, bool showZero = false)
  33. {
  34. var abs = me.Duration();
  35. if (Math.Abs(abs.TotalMilliseconds) < 1) return "0";
  36. var result = new StringBuilder();
  37. void DoPart(TimeSpanPart part)
  38. {
  39. if (!parts.HasFlag(part)) return;
  40. var partValue = DynamicMemberAccess<TimeSpan, int>.Read(abs, part.ToString());
  41. if (0 < partValue || 0 == partValue && showZero)
  42. result.Append(FormatNumber(partValue, DynamicMemberAccess<TimeSpanPart, TimeSpanPart>.ReadStatic(part.ToString())));
  43. }
  44. DoPart(TimeSpanPart.Days);
  45. DoPart(TimeSpanPart.Hours);
  46. DoPart(TimeSpanPart.Minutes);
  47. DoPart(TimeSpanPart.Seconds);
  48. DoPart(TimeSpanPart.Milliseconds);
  49. return result.ToString();
  50. }
  51. }
  52. }