Finding out whether a string is numeric or not

前端 未结 18 1557
一个人的身影
一个人的身影 2020-12-07 15:24

How can we check if a string is made up of numbers only. I am taking out a substring from a string and want to check if it is a numeric substring or not.

NSS         


        
相关标签:
18条回答
  • 2020-12-07 16:03

    Swift 3 solution could be like:

    extension String {
    
        var doubleValue:Double? {
            return NumberFormatter().number(from:self)?.doubleValue
        }
    
        var integerValue:Int? {
            return NumberFormatter().number(from:self)?.intValue
        }
    
        var isNumber:Bool {
            get {
                let badCharacters = NSCharacterSet.decimalDigits.inverted
                return (self.rangeOfCharacter(from: badCharacters) == nil)
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-07 16:07

    I think the easiest way to check that every character within a given string is numeric is probably:

    NSString *trimmedString = [newString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
    
    if([trimmedString length])
    {
        NSLog(@"some characters outside of the decimal character set found");
    }
    else
    {
        NSLog(@"all characters were in the decimal character set");
    }
    

    Use one of the other NSCharacterSet factory methods if you want complete control over acceptable characters.

    0 讨论(0)
  • 2020-12-07 16:10

    Validate by regular expression, by pattern "^[0-9]+$", with following method -validateString:withPattern:.

    [self validateString:"12345" withPattern:"^[0-9]+$"];
    
    1. If "123.123" is considered
      • With pattern "^[0-9]+(.{1}[0-9]+)?$"
    2. If exactly 4 digit numbers, without ".".
      • With pattern "^[0-9]{4}$".
    3. If digit numbers without ".", and the length is between 2 ~ 5.
      • With pattern "^[0-9]{2,5}$".
    4. With minus sign: "^-?\d+$"

    The regular expression can be checked in the online web site.

    The helper function is as following.

    // Validate the input string with the given pattern and
    // return the result as a boolean
    - (BOOL)validateString:(NSString *)string withPattern:(NSString *)pattern
    {
        NSError *error = nil;
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
    
        NSAssert(regex, @"Unable to create regular expression");
    
        NSRange textRange = NSMakeRange(0, string.length);
        NSRange matchRange = [regex rangeOfFirstMatchInString:string options:NSMatchingReportProgress range:textRange];
    
        BOOL didValidate = NO;
    
        // Did we find a matching range
        if (matchRange.location != NSNotFound)
            didValidate = YES;
    
        return didValidate;
    }
    

    Swift 3 version:

    Test in playground.

    import UIKit
    import Foundation
    
    func validate(_ str: String, pattern: String) -> Bool {
        if let range = str.range(of: pattern, options: .regularExpression) {
            let result = str.substring(with: range)
            print(result)
            return true
        }
        return false
    }
    
    let a = validate("123", pattern: "^-?[0-9]+")
    print(a)
    
    0 讨论(0)
  • 2020-12-07 16:13

    John Calsbeek's answer is nearly correct but omits some Unicode edge cases.

    Per the documentation for decimalDigitCharacterSet, that set includes all characters categorized by Unicode as Nd. Thus their answer will accept, among others:

    • (U+0967 DEVANAGARI DIGIT ONE)
    • (U+1811 MONGOLIAN DIGIT ONE)
    0 讨论(0)
  • 2020-12-07 16:14

    You could create an NSScanner and simply scan the string:

    NSDecimal decimalValue;
    NSScanner *sc = [NSScanner scannerWithString:newString];
    [sc scanDecimal:&decimalValue];
    BOOL isDecimal = [sc isAtEnd];
    

    Check out NSScanner's documentation for more methods to choose from.

    0 讨论(0)
  • 2020-12-07 16:14

    This original question was about Objective-C, but it was also posted years before Swift was announced. So, if you're coming here from Google and are looking for a solution that uses Swift, here you go:

    let testString = "12345"
    let badCharacters = NSCharacterSet.decimalDigitCharacterSet().invertedSet
    
    if testString.rangeOfCharacterFromSet(badCharacters) == nil {
        print("Test string was a number")
    } else {
        print("Test string contained non-digit characters.")
    }
    
    0 讨论(0)
提交回复
热议问题