效果如下:
ViewController.h
1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController<UITextFieldDelegate> 4 @property (strong, nonatomic) IBOutlet UITextField *txtLimitInput; 5 6 @end
ViewController.m
1 #import "ViewController.h" 2 3 @interface ViewController () 4 - (void)layoutUI; 5 - (BOOL)validateNumberByASCII:(NSString *)string; 6 - (BOOL)validateNumberByRange:(NSString *)string; 7 - (BOOL)validateNumberByRegExp:(NSString *)string; 8 @end 9 10 @implementation ViewController 11 12 - (void)viewDidLoad { 13 [super viewDidLoad]; 14 15 [self layoutUI]; 16 } 17 18 - (void)didReceiveMemoryWarning { 19 [super didReceiveMemoryWarning]; 20 // Dispose of any resources that can be recreated. 21 } 22 23 - (void)layoutUI { 24 _txtLimitInput.placeholder = @"请输入数字"; 25 26 //第一种方式:设置键盘类型 27 //_txtLimitInput.keyboardType = UIKeyboardTypeDecimalPad; 28 29 //第二种方式:通过 UITextFieldDelegate 的 shouldChangeCharactersInRange: 方法 30 _txtLimitInput.delegate = self; 31 } 32 33 #pragma mark - 三种判断字符串内容是否是有效数字的方式 34 /** 35 * 『ASCII码』判断字符串内容是否是有效数字 36 * 37 * @param string 需要验证的字符串 38 * 39 * @return 字符串内容是否是有效数字 40 */ 41 - (BOOL)validateNumberByASCII:(NSString *)string { 42 BOOL isValid = YES; 43 NSUInteger len = string.length; 44 if (len > 0) { 45 for (NSUInteger i=0; i<len; i++) { 46 NSUInteger asciiCode = [string characterAtIndex:i]; 47 if (asciiCode < 48 || asciiCode > 57) { 48 isValid = NO; 49 break; 50 } 51 } 52 } 53 return isValid; 54 } 55 56 /** 57 * 『字符范围』判断字符串内容是否是有效数字 58 * 59 * @param string 需要验证的字符串 60 * 61 * @return 字符串内容是否是有效数字 62 */ 63 - (BOOL)validateNumberByRange:(NSString *)string { 64 BOOL isValid = YES; 65 NSUInteger len = string.length; 66 if (len > 0) { 67 NSCharacterSet *validNumberCS = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"]; 68 NSUInteger singleStrIndex = 0; 69 do { 70 NSString *singleStr = [string substringWithRange:NSMakeRange(singleStrIndex, 1)]; 71 NSRange range = [singleStr rangeOfCharacterFromSet:validNumberCS]; 72 if (range.length == 0) { 73 isValid = NO; 74 break; 75 } 76 singleStrIndex++; 77 } while (singleStrIndex < len); 78 } 79 return isValid; 80 } 81 82 /** 83 * 『正则表达式;推荐使用,不用循环遍历,控制更灵活』判断字符串内容是否是有效数字 84 * 85 * @param string 需要验证的字符串 86 * 87 * @return 字符串内容是否是有效数字 88 */ 89 - (BOOL)validateNumberByRegExp:(NSString *)string { 90 BOOL isValid = YES; 91 NSUInteger len = string.length; 92 if (len > 0) { 93 NSString *numberRegex = @"^[0-9]*$"; 94 NSPredicate *numberPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", numberRegex]; 95 isValid = [numberPredicate evaluateWithObject:string]; 96 } 97 return isValid; 98 } 99 100 #pragma mark - UITextFieldDelegate 101 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 102 //return [self validateNumberByASCII:string]; 103 //return [self validateNumberByRange:string]; 104 return [self validateNumberByRegExp:string]; //推荐方式 105 } 106 107 @end
Main.storyboard
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc"> 3 <dependencies> 4 <deployment identifier="iOS"/> 5 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/> 6 </dependencies> 7 <scenes> 8 <!--View Controller--> 9 <scene sceneID="ufC-wZ-h7g"> 10 <objects> 11 <viewController id="vXZ-lx-hvc" customClass="ViewController" sceneMemberID="viewController"> 12 <layoutGuides> 13 <viewControllerLayoutGuide type="top" id="jyV-Pf-zRb"/> 14 <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/> 15 </layoutGuides> 16 <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS"> 17 <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> 18 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 19 <subviews> 20 <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="mb3-C5-UpN"> 21 <rect key="frame" x="200" y="285" width="200" height="30"/> 22 <constraints> 23 <constraint firstAttribute="width" constant="200" id="8dl-R0-OzV"/> 24 </constraints> 25 <fontDescription key="fontDescription" type="system" pointSize="14"/> 26 <textInputTraits key="textInputTraits"/> 27 </textField> 28 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="限制 Text Field 输入的内容类型" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8zf-7E-ija"> 29 <rect key="frame" x="200" y="255" width="196" height="17"/> 30 <fontDescription key="fontDescription" type="system" pointSize="14"/> 31 <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/> 32 <nil key="highlightedColor"/> 33 </label> 34 </subviews> 35 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 36 <constraints> 37 <constraint firstItem="mb3-C5-UpN" firstAttribute="centerX" secondItem="kh9-bI-dsS" secondAttribute="centerX" id="Dh5-bw-2LN"/> 38 <constraint firstItem="mb3-C5-UpN" firstAttribute="centerY" secondItem="kh9-bI-dsS" secondAttribute="centerY" id="Lby-hq-mya"/> 39 <constraint firstItem="mb3-C5-UpN" firstAttribute="leading" secondItem="8zf-7E-ija" secondAttribute="leading" id="SyI-SC-iNN"/> 40 <constraint firstItem="mb3-C5-UpN" firstAttribute="top" secondItem="8zf-7E-ija" secondAttribute="bottom" constant="13" id="yuO-kC-OCZ"/> 41 </constraints> 42 </view> 43 <connections> 44 <outlet property="txtLimitInput" destination="mb3-C5-UpN" id="cYi-Ep-sWq"/> 45 </connections> 46 </viewController> 47 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/> 48 </objects> 49 </scene> 50 </scenes> 51 </document>