using System.Linq; using System.Runtime.CompilerServices; namespace PKHeX.Core { public static partial class Util { /// /// Parses the string into an , skipping all characters except for valid digits. /// /// String to parse /// Parsed value public static int ToInt32(string value) { int result = 0; if (string.IsNullOrEmpty(value)) return result; for (int i = 0; i < value.Length; i++) { var c = value[i]; if (IsNum(c)) { result *= 10; result += c; result -= '0'; } else if (c == '-') { result = -result; } } return result; } /// /// Parses the string into a , skipping all characters except for valid digits. /// /// String to parse /// Parsed value public static uint ToUInt32(string value) { uint result = 0; if (string.IsNullOrEmpty(value)) return result; for (int i = 0; i < value.Length; i++) { var c = value[i]; if (IsNum(c)) { result *= 10; result += c; result -= '0'; } } return result; } /// /// Parses the hex string into a , skipping all characters except for valid digits. /// /// Hex String to parse /// Parsed value public static uint GetHexValue(string value) { uint result = 0; if (string.IsNullOrEmpty(value)) return result; for (int i = 0; i < value.Length; i++) { var c = value[i]; if (IsNum(c)) { result <<= 4; result += (uint)(c - '0'); } else if (IsHexUpper(c)) { result <<= 4; result += (uint)(c - 'A' + 10); } else if (IsHexLower(c)) { result <<= 4; result += (uint)(c - 'a' + 10); } } return result; } private static bool IsNum(char c) => c >= '0' && c <= '9'; private static bool IsHexUpper(char c) => c >= 'A' && c <= 'F'; private static bool IsHexLower(char c) => c >= 'a' && c <= 'f'; private static bool IsHex(char c) => IsNum(c) || IsHexUpper(c) || IsHexLower(c); private static string TitleCase(string word) => char.ToUpper(word[0]) + word.Substring(1, word.Length - 1).ToLower(); /// /// Filters the string down to only valid hex characters, returning a new string. /// /// Input string to filter public static string GetOnlyHex(string str) => string.IsNullOrWhiteSpace(str) ? string.Empty : string.Concat(str.Where(IsHex)); /// /// Returns a new string with each word converted to its appropriate title case. /// /// Input string to modify public static string ToTitleCase(string str) => string.IsNullOrWhiteSpace(str) ? string.Empty : string.Join(" ", str.Split(' ').Select(TitleCase)); /// /// Trims a string at the first instance of a 0xFFFF terminator. /// /// String to trim. /// Trimmed string. public static string TrimFromFFFF(string input) => TrimFromFirst(input, (char)0xFFFF); /// /// Trims a string at the first instance of a 0x0000 terminator. /// /// String to trim. /// Trimmed string. public static string TrimFromZero(string input) => TrimFromFirst(input, '\0'); [MethodImpl(MethodImplOptions.AggressiveInlining)] private static string TrimFromFirst(string input, char c) { int index = input.IndexOf(c); return index < 0 ? input : input.Substring(0, index); } } }