这是一个函数的 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"));
}