NSFormatter für IPV4

  • NSFormatter für IPV4

    Hallo!

    Ich habe etwas mit NSFormatter herumgespielt und würde gerne möglichst elegant mittlels isPartialStringValid verhindern,
    dass man etwas Falsches eintippen kann, also etwa 259.0.900.. statt 80.150.123.39

    Hat jemand schon versucht dies zu implementieren?
    Oder gibt es irgendwo ein Beispiel?

    Mein bisheriger fehlerhafter Ansatz:

    -(bool)isPartialStringValid:(NSString*)partialString

    newEditingString:(NSString**) newString

    errorDescription:(NSString**)error

    {




    NSCharacterSet *nonNumbers;

    NSCharacterSet *seachDot;




    nonNumbers = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789xX."] invertedSet];

    seachDot = [NSCharacterSet characterSetWithCharactersInString:@"."];



    if ([partialString rangeOfCharacterFromSet: nonNumbers options: NSLiteralSearch].location != NSNotFound)

    {

    return NO;

    }

    else

    {

    // regular expression is:

    /*

    \b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.

    (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.

    (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.

    (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

    */



    NSLog(@"%@",partialString);

    if ([partialString length]>0)

    {

    // ----- 3 digits

    if ([partialString length] == 3) // 255 249 29. 099 199 19.

    {

    if ([partialString characterAtIndex:0] == '2')

    {

    if ([partialString characterAtIndex:1] == '5')

    {

    if ([partialString characterAtIndex:2] == '.')

    {

    NSLog(@"YES_.");

    return YES;

    }

    else

    if (([partialString characterAtIndex:2] > '5') && ([partialString characterAtIndex:2] <= '9'))

    {

    NSLog(@"No_1");

    return NO;

    }

    }

    else

    if (([partialString characterAtIndex:1] >= '0') && ([partialString characterAtIndex:1] <= '4'))

    {

    // everything 0..9 and dot allowed

    NSLog(@"YES_1");

    return YES;

    }

    }

    else

    if (([partialString characterAtIndex:0] == '0') || ([partialString characterAtIndex:0] == '1'))

    {

    // everything 0..9 and dot allowed

    NSLog(@"YES_2");

    return YES;

    }

    else

    {

    NSLog(@"No_2");

    return NO;

    }




    }

    // ----- 3 digits

    else

    {

    // ----- 1 digits

    if ([partialString length] == 1)

    {

    if ([partialString characterAtIndex:0] == '.')

    {

    NSLog(@"NO_.");

    return NO;

    }

    }

    else

    {

    NSLog(@"YES_not 3");

    return YES;

    }







    }



    }

    else

    {

    return YES;

    }
    }

    ...
  • IP-Formatter

    Danke für Eure Anregungen!

    Das mit den regulären Ausdrücken funtioniert sehr gut, wenn man einen fix fertigen IP-String ala 080.150.144.39 überprüfen will.

    Ich möchte aber in ein Textfeld eine IP eingeben und mittels -(bool)isPartialStringValid(NSString*)partialString verhindern, dass

    ich überhaupt etwas Falsches eingeben kann.

    Der PartialString ist bei der Eingabe z.b.:

    0

    08

    080

    080. etc. Man muss also testen ob das bisher Eingegeben in Kombination mit der aktuellen Eingabe noch einen gültigen String liefert.
  • Hallo,

    das ist doch nicht schwierig:

    Quellcode

    1. // IP Adresse validieren
    2. -(BOOL)isPartialStringValid:(NSString *)partialString
    3. newEditingString:(NSString**)newString
    4. errorDescription:(NSString**)error
    5. {
    6. // Ziffern und Punkt
    7. NSCharacterSet *allowedChars = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
    8. if([partialString rangeOfCharacterFromSet:allowedChars].location != NSNotFound)
    9. {
    10. // Es wurde keine Ziffer oder Punkt getippt
    11. NSBeep();
    12. return NO;
    13. }
    14. else
    15. {
    16. // Keine Punkt Folge
    17. if([partialString rangeOfString:@".."].location != NSNotFound)
    18. {
    19. NSBeep();
    20. return NO;
    21. }
    22. // Keine Punkt am Anfang
    23. if([partialString rangeOfString:@"."].location == 0)
    24. {
    25. NSBeep();
    26. return NO;
    27. }
    28. // Adress-Segmente bilden
    29. NSArray *textSegments = [partialString componentsSeparatedByString:@"."];
    30. // Maximal vier Segmente erlauben
    31. if([textSegments count] > 4)
    32. {
    33. NSBeep();
    34. return NO;
    35. }
    36. // Einzelne Segmente prüfen
    37. for(NSString *segment in textSegments)
    38. {
    39. // Keine 0 am Anfang
    40. if([segment rangeOfString:@"0"].location == 0)
    41. {
    42. NSBeep();
    43. return NO;
    44. }
    45. // Maximal 3 Ziffern
    46. if([segment length] > 3)
    47. {
    48. NSBeep();
    49. return NO;
    50. }
    51. // Kleiner gleich 255
    52. if([segment integerValue] > 255)
    53. {
    54. NSBeep();
    55. return NO;
    56. }
    57. }
    58. }
    59. return YES;
    60. }
    Alles anzeigen


    Jetzt musst Du nur noch prüfen, ob die Eingabe nicht größer als 255 ist.
    Vollstädnig.

    Viele Grüße

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von little_pixel ()