【问题标题】:validate the input of a string as an integer value using c#? [duplicate]使用 c# 将字符串的输入验证为整数值? [复制]
【发布时间】:2021-12-14 08:58:44
【问题描述】:

我有以下代码,我所做的如下: 我输入一串具有以下格式的数字,我所做的是调试并采用正确的格式,例如: 正确格式:XXXX/XX

456/12  = 0456/12  
25/1    = 0025/01
1/23    = 0001/23
/       = 0000/00

但我没有考虑的是,如果输入的是整数,如果是整数,它接受它但它拒绝它。 例如:

A324/1   =  FORMAT ERROR
458/P8   = FORMAT ERROR

如何解决这个问题?

我的代码:

 public static string Validate_Cc(string CourtCase)
        {
           // int i = 0;
            string[] parts = CourtCase.Split('/');
            var number1 = Int32.Parse(parts[0]);
            var number2 = Int32.Parse(parts[1]);

            if ((CourtCase.Length) > 7)
            {
                 badLines(CourtCase);
            }
         
             return $"{number1:0000}/{number2:00}";
        }

【问题讨论】:

标签: c#


【解决方案1】:

使用int.TryParse() 而不是Int32.Parse

将数字的字符串表示形式转换为其等效的 32 位有符号整数。返回值表示操作是否成功。

//I updated condition as well as variable names as per the .net naming convensions
public static string Validate_Cc(string courtCase)
{
    string[] parts = courtCase.Split('/')
           .Select(x => string.IsNullOrEmpty(x) ? "0" : x) //To handle "/" edge case
           .ToArray();

    if(int.TryParse(parts[0], out int number1) && int.TryParse(parts[1], out int number2))
        return $"{number1:0000}/{number2:00}";          
    else
        return BadLines(courtCase);
}

Try online

【讨论】:

  • 我使用int.Parse(),当我使用int.TryPase()时会产生错误。
  • 什么是错误?
  • @JuanSastre,我更新了我的代码以使其更清晰,请看一下
  • 感谢您的支持,我已尝试执行您的代码,但出现语法错误:return badLines(courtCase);,因为它无法将 void 类型转换为字符串
  • 方法错误:public static void badLines (string baditem){....}
【解决方案2】:

我建议用正则表达式检查模式然后解析:

private static string ParseCourtCase(string courtCase)
{
    if(!Regex.Match(courtCase, @"\d+\/\d+").Success)
    {
        throw new InvalidOperationException("Incorrect format of input string.");
    }

    var parts = courtCase.Split('/');
    var number1 = int.Parse(parts[0]);
    var number2 = int.Parse(parts[1]);

    return $"{number1:0000}/{number2:00}";
}

【讨论】:

    【解决方案3】:

    使用此代码:

    public static string Validate_Cc(string CourtCase)
        {
        string[] parts = CourtCase.Split('/');
        if(parts.Length != 2)
        {
            badLines(CourtCase);
        }
        for(int i = 0; i < parts.Length; i++)
        {
            if(parts[i] == "")
            {
                parts[i] = "0";
            }
        }
        var isValidInput = int.TryParse(parts[0], out int number1) & int.TryParse(parts[1], out int number2);
        if(!isValidInput) 
        {
            badLines(CourtCase);
            return input;
        }
       
        return $"{number1:0000}/{number2:00}";
        }
    

    首先,通过检查parts 的长度来检查字符串中是否存在/。然后用"0" 替换空字符串。确保使用&amp; 运算符执行第二个TryParse

    【讨论】:

    • 感谢您的支持,我已经运行了您的代码,它运行良好,但有一点细微差别:例如,A45/25 不应设置为 0000/25。我应该忽略它并在badLines() 中报告它。对于其他数字情况:25/02 -&gt; 0025/02 应用格式是正确的。
    • @JuanSastre 但是你的方法必须返回一些东西。如果输入无效,你想返回什么?
    • 如果它是一个无效条目,我会在一个 csv 文件中返回该输入值,即 badLines(string baditem),此方法会生成一个包含这些无效条目的 csv,因此更容易找到它们并更正它们的格式其他参数。
    • 我的意思是我返回相同的值:A234/3 -&gt; A234/3AP1/3 -&gt; AP1/3 ... 返回相同的值,但通过 badLines() 报告它不是整数字符串的问题
    • @JuanSastre 这可以很容易地完成。只需在调用badLines 后在if 子句中添加return input。我编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2011-12-27
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多