Redzen.Structures.Compact.FixedPointDecimal.InternalTryParse C# (CSharp) Method

InternalTryParse() private static method

private static InternalTryParse ( string s, FixedPointDecimal &result, bool truncateRange ) : bool
s string
result FixedPointDecimal
truncateRange bool
return bool
        private static bool InternalTryParse(string s, out FixedPointDecimal result, bool truncateRange)
        {
            // Clean up string. Do quick null/empty test.
            if(null != s)
            {
                s = s.Trim();
            }

            if(String.IsNullOrEmpty(s))
            {
                result = FixedPointDecimal.Null;
                return false;
            }

            // Split string on optional decimal point.
            string[] parts = s.Split('.');
            if(parts.Length > 2)
            {
                result = FixedPointDecimal.Null;
                return false;
            }

            // Test for negative sign.
            bool isNegative;
            if('-' == parts[0][0])
            {
                isNegative = true;
                parts[0] = parts[0].Substring(1);
                if(string.IsNullOrEmpty(parts[0]))
                {
                    result = FixedPointDecimal.Null;
                    return false;
                }
            }
            else
            {
                isNegative = false;
            }

            // Check fractional part is no longer than 6 digits.
            if(parts.Length == 2 && parts[1].Length > 6)
            {
                if(truncateRange)
                {
                    parts[1] = parts[1].Substring(0, 6);
                }
                else
                {
                    result = FixedPointDecimal.Null;
                    return false;
                }
            }

            // Join integer and fractional parts; paddign fractional part to 6 digits if necessary.
            // Parse resulting significand string as integer.
            string significandStr = parts[0] + (parts.Length == 2 ? parts[1].PadRight(6, '0') : "000000");
            uint significand;
            if(!uint.TryParse(significandStr, out significand))
            {
                result = FixedPointDecimal.Null;
                return false;
            }

            // Test significand is within range of FixedPointDecimal.
            if(significand > 1073741823u)
            {
                if(truncateRange)
                {
                    significand = 1073741823u;
                }
                else
                {
                    result = FixedPointDecimal.Null;
                    return false;
                }
            }

            result = new FixedPointDecimal(significand, isNegative);
            return true;
        }