source: Common/TextProcessing.cs

Last change on this file was 15, checked in by chronos, 6 months ago
  • Modified: Updated files.
File size: 2.9 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace Common
6{
7 public static class TextProcessing
8 {
9 private static readonly string[] SizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
10
11 public static string SizeSuffix(long value, int digitsCount = 3)
12 {
13 if (value < 0)
14 {
15 throw new ArgumentException(@"Bytes should not be negative", nameof(value));
16 }
17 var magnitude = (int)Math.Max(0, Math.Log(value, 1024));
18 var adjustedSize = value / Math.Pow(1024, magnitude);
19 string result;
20 if (adjustedSize != 0)
21 {
22 int digits = (int)Math.Log10(Math.Truncate(adjustedSize)) + 1;
23 result = adjustedSize.ToString("N" + Math.Max(digitsCount - digits, 0));
24 }
25 else result = "0";
26
27 return result + " " + SizeSuffixes[magnitude];
28 }
29
30 public static IEnumerable<string> SplitAndKeep(this string text, string[] separators)
31 {
32 int start = 0;
33 int index;
34 string lastSeparator = null;
35
36 while ((index = text.IndexOfAny(separators, start, out string separator)) != -1)
37 {
38 if (start == 0)
39 {
40 yield return text.Substring(0, index);
41 }
42 else
43 {
44 yield return text.Substring(start - lastSeparator?.Length ?? 0,
45 index - start - lastSeparator?.Length ?? 0);
46 }
47
48 start = index + separator.Length;
49 lastSeparator = separator;
50 }
51
52 if (start < text.Length)
53 {
54 yield return text.Substring(start - lastSeparator?.Length ?? 0);
55 }
56 }
57
58 public static int IndexOfAny(this string text, string[] anyOf, int startIndex, out string resultSeparator)
59 {
60 int result = -1;
61 resultSeparator = null;
62 foreach (var separator in anyOf)
63 {
64 int index = text.IndexOf(separator, startIndex, StringComparison.Ordinal);
65 if (index >= startIndex && result < index)
66 {
67 result = index;
68 resultSeparator = separator;
69 }
70 }
71
72 return result;
73 }
74
75 public static bool StartsWith(this string text, string value, int start, StringComparison comparisonType)
76 {
77 // TODO: Can be possibly optimized without temporary string creation
78 return text.Substring(start).StartsWith(value, comparisonType);
79 }
80
81 public static string Repeat(this string s, int n)
82 => new StringBuilder(s.Length * n).Insert(0, s, n).ToString();
83 }
84}
Note: See TracBrowser for help on using the repository browser.