C#中的Float / Double类型输入验证

时间:2016-05-30 08:44:52

标签: c# validation input

这实际上是我写的第一个程序(上周一开始学习);我是个新手。

我的问题是,当程序提示用户输入fahreinheit或celsius条目(期待一个数字)时,如何防止用户输入无效字符时抛出异常?因此,例如,当用户输入“asfasd”时,程序会抛出异常。

我在发布之前在网站上做了很多搜索,我成功地找到了其他输入验证问题,但是,他们都是关于C和C ++的,因为我是一个新手,我很难过了解这些语言以及它们与C#的关系。谢谢。请参阅代码:

@POST
@Path("/loaduser")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void getinfo(employeedatapojo emp, MethodCallback < employeedatapojo > methodCallback);



//doa

@RequestMapping(value = "/loaduser", method = RequestMethod.POST, headers = "Accept=application/json")
public @ResponseBody employeedatapojo getinfo(@RequestBody employeedatapojo emp, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {


 boolean status = false;
 employeedatapojo empobj = new employeedatapojo();

 emplyoeedao obj1 = new emplyoeedao();
 empobj = obj1.returnempobject(emp.getemployeeid());
 System.out.println("languages inside loaduse restgwt" + empobj.getlanguages());

 return empobj;


}

//AT the ui side
//load user is executing but response is not coming

InfoService.Util.getService().loaduser(emp1, new MethodCallback < employeedatapojo > () {

   @Override
   public void onSuccess(Method method, employeedatapojo response) {
    Window.alert("inside user info after receiving object");

   }
   @Override
   public void onFailure(Method method, Throwable exception) {

    Window.alert("not assigned ");

   }

}

5 个答案:

答案 0 :(得分:4)

TryParse是你在这里的好朋友。在大多数情况下,您应该使用Parse而不是int validInt; int.TryParse(Console.ReadLine(), out validInt); float validFloat; float.TryParse(Console.ReadLine(), out validFloat); 。在您的示例中,您可以执行以下操作:

$(document).ready(function(){
  
  $('#random-select').change(function()
	{
    alert($(this).val());
    
  });
    
  
});
</script>

Parse vs. TryParse

答案 1 :(得分:4)

您可以将其放入Try-Catch块或使用while循环来验证用户输入。

下面是带有while循环的代码,用于验证用户输入。

class Program
{
    static void Main(string[] args)
    {
        double FahrenheitInput = 0;
        double CelsiusInput = 0;
        double KilogramInput = 0;
        double PoundsInput = 0;
        int UserChoice = 0;
        do
        {

            Console.WriteLine("What would you like to convert? Enter the corresponding number.\n1. Fahrenheit to Celsius");
            Console.WriteLine("2. Celsius to Fahrenheit\n3. Pounds to Kilograms\n4. Kilograms to pounds\n5. Exit program");
            UserChoice = int.Parse(Console.ReadLine());
            switch (UserChoice)
            {
                case 1:
                    Console.WriteLine("Enter the temperature in Fahreinheit, number only:");
                    while (!double.TryParse(Console.ReadLine(), out FahrenheitInput))
                    {
                        Console.WriteLine("Invalid format, please input again!");
                    };
                    Console.Clear();
                    Console.WriteLine(FahrenheitInput + " degrees fahrenheit in Celsius is " + Program.FahrenheitToCelsius(FahrenheitInput) + "\n\n");
                    break;
                case 2:
                    Console.WriteLine("Enter the temperature in Celsius, number only:");
                    while (!double.TryParse(Console.ReadLine(), out CelsiusInput))
                    {
                        Console.WriteLine("Invalid format, please input again!");
                    };
                    Console.Clear();
                    Console.WriteLine(CelsiusInput + " degrees Celius in fahrenheit is " + Program.CelsiusToFahrenheit(CelsiusInput) + "\n\n");
                    break;
                case 5:
                    break;
                default:
                    Console.WriteLine("This is not a valid entry. Please enter 1, 2, 3, 4, or 5.");
                    break;

            }
        } while (UserChoice != 5);

    }
    public static double FahrenheitToCelsius(double INPUT)
    {
        return (INPUT - 32) * 5 / 9;
    }
    public static double CelsiusToFahrenheit(double INPUT)
    {
        return INPUT * 1.8 + 32;
    }
}

答案 2 :(得分:2)

改变例程的最简单方法是将Parse重写为相应的TryParse

  // UserChoice = int.Parse(Console.ReadLine());
  UserChoice = int.TryParse(Console.ReadLine(), out UserChoice) ? UserChoice : -1;

...

有点复杂(您必须将float转换为float?

  // FahrenheitInput = float.Parse(Console.ReadLine());
  float v;
  FahrenheitInput = float.TryParse(Console.ReadLine(), out v) ? (float?) v : null;

CelsiusInput

的相同方案
  // CelsiusInput = double.Parse(Console.ReadLine());
  double d;
  CelsiusInput = double.TryParse(Console.ReadLine(), out v) d (double?) d : null;

代码的基础机制是

  • 我们尝试解析用户输入TryParse(Console.ReadLine()...
  • 如果解析成功(因此TryParse返回true),我们只返回out(解析后的值)。
  • 如果解析失败(因此TryParse返回false),我们会返回一些特殊值(-1 UserChoice或{{1}如果是nullFahrenheitInput
第一个CelsiusInput中的

P.S。switchcase 1case 2;但是,你已经说“这不是一个有效的条目。请输入1,2, 3,4,或5.”在错误消息中。看来,您必须在case 5中实施case 3 and case 4或编辑错误消息。

答案 3 :(得分:1)

使用private void Connection_StateChanged(StateChange obj) { if (obj.NewState == ConnectionState.Disconnected) { var current = DateTime.Now.TimeOfDay; SetTimer(current.Add(TimeSpan.FromSeconds(30)), TimeSpan.FromSeconds(10), StartCon); } else { if (_timer != null) _timer.Dispose(); } } private async Task StartCon() { await Connection.Start(); } private Timer _timer; private void SetTimer(TimeSpan starTime, TimeSpan every, Func<Task> action) { var current = DateTime.Now; var timeToGo = starTime - current.TimeOfDay; if (timeToGo < TimeSpan.Zero) { return; } _timer = new Timer(x => { action.Invoke(); }, null, timeToGo, every); } 代替int.TryParseint.Parse代替float.tryParse

答案 4 :(得分:0)

虽然提供的所有答案似乎都有效,但您提出的问题是

  

如何防止异常被抛出[...]

我只是想指出你通过将exception放在try - catch块中的部分来实现这一点。它的作用是执行try中的代码,直到exception被抛出,然后将此exception作为参数传递给catch - 您可以处理的部分它:

示例

do
{
    try
    {
         // the code you already have
    }
    catch (Exception ex)
    {
         Console.WriteLine("This is no valid input (" + ex.Message + ")! Try again...");
    }
} while (UserChoice != 5);

当然,首先阻止exception完全放弃throw n是更好的方式(正如所有其他答案所建议的那样),但这种方法也有效,并且更通用如果您将来遇到类似的问题。使用switch - case - 语句进行错误处理是非常常见的做法......