验证 JSON 数字

问题描述 投票:0回答:0

这是一个函数的 C# 实现,用于确定字符串是否表示有效的 JSON 数字。该函数称为 IsJsonNumber 并采用单个参数输入,即要测试的字符串。

该函数首先检查输入字符串是否为 null 或空,如果为空,则返回 false。此实现旨在符合来自 json.org 的 JSON 规范。

using System;

namespace Json
{
    public static class JsonNumber
    {
        public static bool IsJsonNumber(string input)
        {
            if (string.IsNullOrEmpty(input))
            {
                return false;
            }

            int dotIndex = input.IndexOf('.');
            int exponentIndex = input.IndexOfAny(new[] { 'e', 'E' });

            return IsInteger(Integer(input, dotIndex, exponentIndex))
                && IsFraction(Fraction(input, dotIndex, exponentIndex))
                && IsExponent(Exponent(input, exponentIndex))
                && !input.EndsWith(".");
        }

        private static bool IsDigits(string input)
        {
            foreach (char c in input)
            {
                if (!char.IsDigit(c))
                {
                    return false;
                }
            }

            return input.Length > 0;
        }

        private static string Integer(string input, int dotIndex, int exponentIndex)
        {
            if (dotIndex < 0 && exponentIndex < 0)
            {
                return input;
            }

            int end = dotIndex < 0 ? exponentIndex : dotIndex;
            return input[..end];
        }

        private static bool IsInteger(string input)
        {
            if (string.IsNullOrEmpty(input))
            {
                return false;
            }

            if (input[0] == '-')
            {
                input = input[1..];
            }

            if (input.Length == 1 && input[0] == '0')
            {
                return true;
            }

            if (input[0] == '0')
            {
                return false;
            }

            return IsDigits(input);
        }

        private static string Fraction(string input, int dotIndex, int exponentIndex)
        {
            if (dotIndex < 0)
            {
                return "";
            }

            int start = dotIndex + 1;
            int end = exponentIndex < 0 ? input.Length : exponentIndex;
            return input[start..end];
        }

        private static bool IsFraction(string input)
        {
            if (string.IsNullOrEmpty(input))
            {
                return true;
            }

            if (!IsDigits(input))
            {
                return false;
            }

            return (input[0] != '0') || input.TrimEnd('0').Length > 0;
        }

        private static string Exponent(string input, int exponentIndex)
        {
            if (exponentIndex < 0)
            {
                return "";
            }

            int start = exponentIndex + 1;
            return input[start..];
        }

        private static bool IsExponent(string input)
        {
            if (string.IsNullOrEmpty(input))
            {
                return true;
            }

            int signIndex = input.IndexOfAny(new[] { '+', '-' });
            if (signIndex == -1)
            {
                // No sign, just digits
                return IsDigits(input);
            }
            else if (signIndex == input.Length - 1)
            {
                // Sign at the end, not valid
                return false;
            }
            else
            {
                // Sign with digits
                string digits = input[(signIndex + 1) ..];
                return IsDigits(digits) && digits.Length > 0;
            }
        }
    }
}

我有一个测试失败了。

 [Fact]
        public void TheExponentIsAlwaysComplete()
        {
            Assert.False(IsJsonNumber("22e"));
            Assert.False(IsJsonNumber("22e+"));
            Assert.False(IsJsonNumber("23E-"));
        }

如果我尝试修复它,它将使基本测试(如下所示)失败:

  [Fact]
        public void CanBeZero()
        {
            Assert.True(IsJsonNumber("0"));
        }

        
        [Fact]
        public void CanHaveASingleDigit()
        {
            Assert.True(IsJsonNumber("7"));
        }

        [Fact]
        public void CanHaveMultipleDigits()
        {
            Assert.True(IsJsonNumber("70"));
        }
c# json tdd
© www.soinside.com 2019 - 2024. All rights reserved.