pascalfreepascal

how to validate input with "real" as the variable to numbers only?


im a coding newbie, currently using freepascal to learn. i want to make a simple temperature converter. im struggling at how to validate the input. because im using "real" as var, and i cant validate the input to numbers and negative sign only. i want to write "false input" and repeat to temperature input, if the input contains alphabet/alphanumeric. but when i input the temperature in alphabet/alphanumeric it will just exiting from program. how to do this correctly? is there any solution?

input validation with "real" as the variable

here's my current code

program Fahrenheit_to_Celsius;
uses crt;
function strtofloat (floatstring : string) : extended;
var F: string;
floatvalue: extended;
C: real;
exit: boolean;
decision: shortstring;
    begin
     clrscr;
     textattr :=$3;
     gotoxy (52,1);
     writeln ('Fahrenheit to Celsius Converter');
      repeat
       write ('Input Fahrenheit: ');
       readln (F);
       begin
        try
        F := strtofloat ('10 E 2');
        except
        on exception : econverterror do
        showmessage (exception.message);
        end;
        try
        F := strtofloat ('$FF');
        except
        on exception : econverterror do
        showmessage (exception.message);
        end;
       C := ((F-32)*(5/9));
       writeln ('Temperature in Celsius: ', C:0:5);
        begin
         writeln;
         gotoxy ((wherex () + 56), (wherey() - 0));
         writeln ('Convert again or exit?');
         gotoxy ((wherex () + 31), (wherey() - 0));
         writeln ('Input e then press enter to exit or input anything else to convert again');
         write ('Decision:');
         readln (decision);
         if (decision = 'e') then
         exit := true
         else
         exit := false;
         gotoxy ((wherex () + 0), (wherey() - 3));
         delline;
         gotoxy ((wherex () + 0), (wherey() - 0));
         delline;
        end;
      until exit;
    end.

Solution

  • It's been a long time since I practiced pascal but I will give you an idea, I think you cannot validate it this way because if you declare the input as real once the program recive an non valid input it exits, so what I suggest, is to declare the variable as string instead, then you create a function to validate it, finally if the function returns true you convert the string to float.

    The function should loop through every character in the recieved string and returns false if

    1. one character is not a number or not a .
    2. the string contains more then one . ( create a variable and increment it every time you catch a character equal to . )
    3. the first character is .
    4. the last character is .