C#检查字符串是否包含字符,但允许其他特定字符使用

时间:2018-10-21 09:37:10

标签: c# asp.net

我的单位转换器应用程序有问题。我试图阻止用户使用数字以外的任何其他字符,但我需要允许他们使用“。”我该怎么办?

我在这上面花了2天,没有运气。请帮忙。这是我的代码。

 public string[] YardsToMeters(string yards)
        {
            if(yards == null || yards.Contains(" "))
            {
                string[] str = new string[1];
                str[0] = "Please enter some values";

                return str;

            }

我在这里检查允许的字符

            else if((Regex.IsMatch(yards, @"^\d+$") == true) || (yards.Contains(".") && yards[0] != '.'
                 || (yards.Contains('\n')) && (Regex.IsMatch(yards, @"^\d+$") == true) && !yards.Contains(".")))
            {

                if (!yards.Contains('\n') && Regex.IsMatch(yards, @"^\d+$") == true)
                {
                    double d = double.Parse(yards, CultureInfo.InvariantCulture) * 0.9144f;

                    string[] array = new string[1];
                    array[0] = d.ToString();

                    return array;

                }

                else if(Regex.IsMatch(yards, @"^\d+$") == true || yards.Contains(".") && yards[0] != '.')
                {
                    double[] doubles = new double[yards.Split("\r\n").Count()];

                    for (int i = 0; i < yards.Split("\r\n").Count(); i++)
                    {
                        if (yards.Contains("."))
                        {
                            double value = Convert.ToDouble(yards.Split("\r\n")[i].Replace('.',','));
                            doubles[i] += value;

                            string.Format("{0}", value * 0.9144f);
                        }

                        else
                        {
                            double value = Convert.ToDouble(yards.Split("\r\n")[i]);
                            doubles[i] += value;

                            string.Format("{0}", value * 0.9144f);
                        }


                    }

                    string[] strings = new string[doubles.Length];

                    for (int i = 0; i < yards.Split('\n').Length; i++)
                    {
                        strings[i] = string.Format("{0}", doubles[i] * 0.9144f);
                    }

                    return strings;
                }
                else
                {
                    string[] str = new string[1];
                    str[0] = "Please use numbers only!";

                    return str;
                }

            }
            else
            {

                string[] str = new string[1];
                str[0] = "Please use numbers only! Enter is also not allowed";

                return str;

            }
        }

请帮助我。

1 个答案:

答案 0 :(得分:0)

我认为您已经达到了无法达到目标的地步,并且您一直在不断地修改和调整一个错误的解决方案,以尝试涵盖所有失败的情况

码为米->码数乘以0.9144f

public double YardsToMetres(double yards){ //not sure why you're using string everywhere
    return yards * 0.9144f;
}


public void YardsTextbox_TextChanged(object sender, EventArgs e){
    try{
        double y = double.Parse(_yardsTextbox.Text);
        MessageBox.Show("In metres:" + YardsToMetres(y));
    } catch(FormatException ex){
        MessageBox.Show("The value you entered (" + _yardsTextbox.Text + ") cannot be converted to a number. Enter a number");
    }
}

这是一个示例,对您的用户界面一无所知。建议您将转换代码与其余代码分开。它应该带一个数字并返回一个数字(不要仅仅因为输入/输出提供/需要而将所有字符串都设为字符串)。

您的从用户收集数据的输入例程应将其输入解析为准备用于转换器的数字。如果解析失败,请他们更正。对此不要过于深入和有意义/复杂-尝试解析它,如果失败,则告诉用户失败-他们将找出他们做错了什么。您可以提供一些有限的帮助,例如,如果需要的话,一开始就修剪空白(实际上double.parse会忽略空白,因此这是不必要的),但我可能会停止删除所有非数字等,因为您这样做了用户输入的数据的操作,进行计算的结果,并且用户不知道(除非您告诉他们)最终要进行计算的数据是什么。

如果他们写0xFF80,并期望将其十六进制数(相当于65,408)转换为mtres,那么如果您去除了xFF,然后对80进行计算,他们可能会感到惊讶

类似地,可以使双重解析对不同的文化敏感。有人将1,234.5写为1.234,5。如果您决定删除逗号(因为它们是千位分隔符),那么如果某人使用逗号作为十进制分隔符,那么最终将破坏某人的十进制数字。仔细考虑您想深入检查并帮助用户正确形成数字的深度;您最好尝试使用他们给您的东西,如果失败,告诉他们