मैं स्ट्रिंग इनपुट को कैसे मान्य करूँ UITextField
? मैं यह जांचना चाहता हूं कि स्ट्रिंग दशमलव अंक सहित संख्यात्मक है।
मैं स्ट्रिंग इनपुट को कैसे मान्य करूँ UITextField
? मैं यह जांचना चाहता हूं कि स्ट्रिंग दशमलव अंक सहित संख्यात्मक है।
जवाबों:
मैं अपने मैक ऐप में इस कोड का उपयोग करता हूं, समान या समान आईफोन के साथ काम करना चाहिए। यह RegexKitLite नियमित अभिव्यक्ति पर आधारित है और इसके अमान्य होने पर पाठ को लाल कर देता है।
static bool TextIsValidValue( NSString* newText, double &value )
{
bool result = false;
if ( [newText isMatchedByRegex:@"^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"] ) {
result = true;
value = [newText doubleValue];
}
return result;
}
- (IBAction) doTextChanged:(id)sender;
{
double value;
if ( TextIsValidValue( [i_pause stringValue], value ) ) {
[i_pause setTextColor:[NSColor blackColor]];
// do something with the value
} else {
[i_pause setTextColor:[NSColor redColor]];
}
}
(?:|0|[1-9]\\d*)(?:\\.\\d*)
इसका मतलब देखने के लिए कॉपी / पेस्ट करें। इसके अलावा Regex Wikipedia
आप इसे कुछ लाइनों में इस तरह से कर सकते हैं:
BOOL valid;
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:myInputField.text];
valid = [alphaNums isSupersetOfSet:inStringSet];
if (!valid) // Not numeric
- यह इनपुट को मान्य करने के लिए है केवल संख्यात्मक वर्ण है। NSCharacterSet
अन्य विकल्पों के लिए दस्तावेज़ देखें। मान्य इनपुट वर्णों के किसी भी सेट को निर्दिष्ट करने के लिए आप characterSetWithCharactersInString का उपयोग कर सकते हैं।
ऐसा करने के कुछ तरीके हैं:
nil
यदि यह नहीं कर सकता है तो यह एक NSNumber लौटा देगा ।IMO, जैसे कुछ का उपयोग -[NSString doubleValue]
करना सबसे अच्छा विकल्प नहीं होगा क्योंकि दोनों @"0.0"
का @"abc"
डबल होगा और 0. का एक डबल वेल्यू होगा। * वैल्यू मेथड्स सभी रिटर्न 0 हैं यदि वे स्ट्रिंग को ठीक से कन्वर्ट करने में सक्षम नहीं हैं, तो एक के बीच अंतर करना मुश्किल होगा की वैध स्ट्रिंग @"0"
और गैर-वैध स्ट्रिंग। सी के strtol
फंक्शन जैसा ही कुछ मुद्दा होगा।
मुझे लगता है कि NSNumberFormatter का उपयोग करना सबसे अच्छा विकल्प होगा, क्योंकि यह लोकेल को ध्यान में रखता है (यानी, @"1,23"
यूरोप में संख्या , @"1.23"
संयुक्त राज्य अमेरिका में)।
NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; NSNumber * n = [f numberFromString:@"34jfkjdskj80"]; NSLog(@"N: %@", n);
NSScanner
, जैसे NSNumberFormatter
, स्ट्रिंग को पार्स करते समय लोकेल को ध्यान में रखता है, बशर्ते आप setLocale:
स्कैनर ऑब्जेक्ट पर उपयोग करें (उदाहरण के लिए, आप प्रदान कर सकते हैं) [NSLocale currentLocale]
)।
यदि आप चाहते हैं कि एक उपयोगकर्ता को केवल अंकों में प्रवेश करने की अनुमति दी जाए, तो आप अपने ViewController को UITextFieldDelegate का हिस्सा बना सकते हैं और इस विधि को परिभाषित कर सकते हैं:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string];
// The user deleting all input is perfectly acceptable.
if ([resultingString length] == 0) {
return true;
}
NSInteger holder;
NSScanner *scan = [NSScanner scannerWithString: resultingString];
return [scan scanInteger: &holder] && [scan isAtEnd];
}
शायद अधिक कुशल तरीके हैं, लेकिन मुझे यह बहुत सुविधाजनक तरीका लगता है। और युगल या जो कुछ भी मान्य करने के लिए विधि आसानी से अनुकूल होनी चाहिए: बस स्कैनडबल का उपयोग करें: या इसी तरह।
#pragma mark - UItextfield Delegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([string isEqualToString:@"("]||[string isEqualToString:@")"]) {
return TRUE;
}
NSLog(@"Range ==%d ,%d",range.length,range.location);
//NSRange *CURRANGE = [NSString rangeOfString:string];
if (range.location == 0 && range.length == 0) {
if ([string isEqualToString:@"+"]) {
return TRUE;
}
}
return [self isNumeric:string];
}
-(BOOL)isNumeric:(NSString*)inputString{
BOOL isValid = NO;
NSCharacterSet *alphaNumbersSet = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:inputString];
isValid = [alphaNumbersSet isSupersetOfSet:stringSet];
return isValid;
}
यहाँ कुछ वन-लाइनर्स हैं जो उपरोक्त पीटर लुईस के उत्तर को जोड़ते हैं ( जाँचें कि UITextField के लिए एक इनपुट केवल संख्यात्मक है ) NSPredicates के साथ
#define REGEX_FOR_NUMBERS @"^([+-]?)(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"
#define REGEX_FOR_INTEGERS @"^([+-]?)(?:|0|[1-9]\\d*)?$"
#define IS_A_NUMBER(string) [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_NUMBERS] evaluateWithObject:string]
#define IS_AN_INTEGER(string) [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_INTEGERS] evaluateWithObject:string]
पूर्णांक परीक्षण के लिए यह होगा:
- (BOOL) isIntegerNumber: (NSString*)input
{
return [input integerValue] != 0 || [input isEqualToString:@"0"];
}
आप अपने स्ट्रिंग के doubleValue का उपयोग कर सकते हैं जैसे
NSString *string=@"1.22";
double a=[string doubleValue];
मुझे लगता है कि यह 0.0 के रूप में वापस आ जाएगा यदि स्ट्रिंग अमान्य है (यह एक अपवाद फेंक सकता है, तो जिस स्थिति में आप इसे पकड़ सकते हैं, डॉक्स 0.0 tho कहते हैं)। अधिक जानकारी यहाँ
नमस्ते में ठीक वैसी ही समस्या थी और मैंने जो उत्तर पोस्ट किया था, उसे यहाँ नहीं देखा, इसलिए यहाँ है।
मैंने आईबी के माध्यम से अपने पाठ क्षेत्र को बनाया और जुड़ा। जब मैंने इसे कंट्रोल + ड्रैग के माध्यम से अपने कोड से जोड़ा, तो मैंने एक्शन को चुना, फिर एडिटिंग चेंजेड इवेंट को चुना। यह प्रत्येक वर्ण प्रविष्टि पर विधि को ट्रिगर करता है। आप सूट करने के लिए एक अलग घटना का उपयोग कर सकते हैं।
बाद में, मैंने पाठ को बदलने के लिए इस सरल कोड का उपयोग किया। ध्यान दें कि मैंने दशमलव / अवधि वर्ण और संख्याओं को शामिल करने के लिए अपना स्वयं का वर्ण बनाया है। मूल रूप से अमान्य वर्णों पर स्ट्रिंग को अलग करता है, फिर उन्हें खाली स्ट्रिंग के साथ जोड़ देता है।
- (IBAction)myTextFieldEditingChangedMethod:(UITextField *)sender {
NSCharacterSet *validCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];
NSCharacterSet *invalidCharacterSet = validCharacterSet.invertedSet;
sender.text = [[sender.text componentsSeparatedByCharactersInSet:invalidCharacterSet] componentsJoinedByString:@""];
}
खेल के अंत में लेकिन यहाँ एक आसान सा वर्ग है जिसका उपयोग मैं दशमलव स्थानों और उसके लिए उपयोग किए जाने वाले स्थानीय प्रतीक के लिए करता हूँ। इसका सार यहाँ लिंक करें
@interface NSString (Extension)
- (BOOL) isAnEmail;
- (BOOL) isNumeric;
@end
@implementation NSString (Extension)
/**
* Determines if the current string is a valid email address.
*
* @return BOOL - True if the string is a valid email address.
*/
- (BOOL) isAnEmail
{
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:self];
}
/**
* Determines if the current NSString is numeric or not. It also accounts for the localised (Germany for example use "," instead of ".") decimal point and includes these as a valid number.
*
* @return BOOL - True if the string is numeric.
*/
- (BOOL) isNumeric
{
NSString *localDecimalSymbol = [[NSLocale currentLocale] objectForKey:NSLocaleDecimalSeparator];
NSMutableCharacterSet *decimalCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:localDecimalSymbol];
[decimalCharacterSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
NSCharacterSet* nonNumbers = [decimalCharacterSet invertedSet];
NSRange r = [self rangeOfCharacterFromSet: nonNumbers];
if (r.location == NSNotFound)
{
// check to see how many times the decimal symbol appears in the string. It should only appear once for the number to be numeric.
int numberOfOccurances = [[self componentsSeparatedByString:localDecimalSymbol] count]-1;
return (numberOfOccurances > 1) ? NO : YES;
}
else return NO;
}
@end
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if(string.length > 0)
{
NSCharacterSet *numbersOnly = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:string];
BOOL stringIsValid = [numbersOnly isSupersetOfSet:characterSetFromTextField];
return stringIsValid;
}
return YES;
}
IMO अपने लक्ष्य को पूरा करने का सबसे अच्छा तरीका सामान्य कीबोर्ड के बजाय एक संख्यात्मक कीबोर्ड प्रदर्शित करना है। यह प्रतिबंधित करता है कि उपयोगकर्ता के लिए कौन सी कुंजी उपलब्ध है। यह सत्यापन करने की आवश्यकता को कम करता है, और इससे भी महत्वपूर्ण बात यह है कि यह उपयोगकर्ता को गलती करने से रोकता है। संख्या दर्ज करने के लिए संख्या पैड भी बहुत अच्छा है क्योंकि चाबियाँ काफी बड़ी हैं।
इंटरफ़ेस बिल्डर में UITextField का चयन करें, गुण निरीक्षक पर जाएं और "कीबोर्ड प्रकार" को "दशमलव" में बदलें।
कि कीबोर्ड इस तरह दिखाई देगा:
केवल यह करना बाकी है कि उपयोगकर्ता दो दशमलव स्थानों में प्रवेश न करे। आप ऐसा तब कर सकते हैं जब वे संपादन कर रहे हों। अपने दृश्य नियंत्रक में निम्न कोड जोड़ें। यह कोड दर्ज होते ही दूसरा दशमलव स्थान हटा देता है। यह उपयोगकर्ता को ऐसा प्रतीत होता है जैसे कि द्वितीय दशमलव पहले स्थान पर कभी नहीं दिखाई दिया।
- (void)viewDidLoad
{
[super viewDidLoad];
[self.textField addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
}
- (void)textFieldDidChange:(UITextField *)textField
{
NSString *text = textField.text;
NSRange range = [text rangeOfString:@"."];
if (range.location != NSNotFound &&
[text hasSuffix:@"."] &&
range.location != (text.length - 1))
{
// There's more than one decimal
textField.text = [text substringToIndex:text.length - 1];
}
}
@property (strong) NSNumberFormatter *numberFormatter;
@property (strong) NSString *oldStringValue;
- (void)awakeFromNib
{
[super awakeFromNib];
self.numberFormatter = [[NSNumberFormatter alloc] init];
self.oldStringValue = self.stringValue;
[self setDelegate:self];
}
- (void)controlTextDidChange:(NSNotification *)obj
{
NSNumber *number = [self.numberFormatter numberFromString:self.stringValue];
if (number) {
self.oldStringValue = self.stringValue;
} else {
self.stringValue = self.oldStringValue;
}
}
पुराना धागा, लेकिन यह ध्यान देने योग्य है कि Apple ने NSRegularExpression
iOS 4.0 में पेश किया। (पीटर की प्रतिक्रिया से नियमित अभिव्यक्ति लेते हुए)
// Look for 0-n digits from start to finish
NSRegularExpression *noFunnyStuff = [NSRegularExpression regularExpressionWithPattern:@"^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$" options:0 error:nil];
// There should be just one match
if ([noFunnyStuff numberOfMatchesInString:<#theString#> options:0 range:NSMakeRange(0, <#theString#>.length)] == 1)
{
// Yay, digits!
}
मैं सुझाव देता हूं कि NSRegularExpression
उदाहरण कहीं और संग्रहीत करें ।
मैं एक पाठ क्षेत्र चाहता था जो केवल पूर्णांकों की अनुमति देता हो। यहाँ मैंने क्या किया (यहाँ और अन्य जगहों से जानकारी का उपयोग करके):
पूर्णांक संख्या फ़ॉर्मेटर बनाएं (UIApplicationDelegate में इसका पुन: उपयोग किया जा सकता है):
@property (nonatomic, retain) NSNumberFormatter *integerNumberFormatter;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Create and configure an NSNumberFormatter for integers
integerNumberFormatter = [[NSNumberFormatter alloc] init];
[integerNumberFormatter setMaximumFractionDigits:0];
return YES;
}
UITextFieldDelegate में फ़िल्टर का उपयोग करें:
@interface MyTableViewController : UITableViewController <UITextFieldDelegate> {
ictAppDelegate *appDelegate;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// Make sure the proposed string is a number
NSNumberFormatter *inf = [appDelegate integerNumberFormatter];
NSString* proposedString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSNumber *proposedNumber = [inf numberFromString:proposedString];
if (proposedNumber) {
// Make sure the proposed number is an integer
NSString *integerString = [inf stringFromNumber:proposedNumber];
if ([integerString isEqualToString:proposedString]) {
// proposed string is an integer
return YES;
}
}
// Warn the user we're rejecting the change
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
return NO;
}
इतना सुंदर, लेकिन सरल नहीं है :)
- (BOOL) isNumber: (NSString*)input
{
return [input doubleValue] != 0 || [input isEqualToString:@"0"] || [input isEqualToString:@"0.0"];
}
स्विफ्ट 3 में आईपैड और आईफोन के साथ काम करने वाले एकल (।) डॉट के साथ टेक्स्ट फ़ील्ड में दशमलव मान स्वीकार करें
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let inverseSet = NSCharacterSet(charactersIn:"0123456789").inverted
let components = string.components(separatedBy: inverseSet)
let filtered = components.joined(separator: "")
if filtered == string {
return true
} else {
if string == "." {
let countdots = textField.text!.components(separatedBy:".").count - 1
if countdots == 0 {
return true
}else{
if countdots > 0 && string == "." {
return false
} else {
return true
}
}
}else{
return false
}
}
}
अधिक अंतरराष्ट्रीय होने के लिए (और केवल यूएस रंगीन;;) केवल ऊपर दिए गए कोड में प्रतिस्थापित न करें
-(NSNumber *) getNumber
{
NSString* localeIdentifier = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLocale *l_en = [[NSLocale alloc] initWithLocaleIdentifier: localeIdentifier] ;
return [self getNumberWithLocale: [l_en autorelease] ];
}
यह उत्तर NSFormatter का उपयोग करता है जैसा कि पहले कहा गया था। इसकी जांच - पड़ताल करें:
@interface NSString (NSNumber)
- (BOOL) isNumberWithLocale:(NSLocale *) stringLocale;
- (BOOL) isNumber;
- (NSNumber *) getNumber;
- (NSNumber *) getNumberWithLocale:(NSLocale*) stringLocale;
@end
@implementation NSString (NSNumber)
- (BOOL) isNumberWithLocale:(NSLocale *) stringLocale
{
return [self getNumberWithLocale:stringLocale] != nil;
}
- (BOOL) isNumber
{
return [ self getNumber ] != nil;
}
- (NSNumber *) getNumber
{
NSLocale *l_en = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US"] ;
return [self getNumberWithLocale: [l_en autorelease] ];
}
- (NSNumber *) getNumberWithLocale:(NSLocale*) stringLocale
{
NSNumberFormatter *formatter = [[ [ NSNumberFormatter alloc ] init ] autorelease];
[formatter setLocale: stringLocale ];
return [ formatter numberFromString:self ];
}
@end
मुझे उम्मीद है कि यह किसी की मदद करता है। =)
#import "NSString+Extension.h"
//@interface NSString (Extension)
//
//- (BOOL) isAnEmail;
//- (BOOL) isNumeric;
//
//@end
@implementation NSString (Extension)
- (BOOL) isNumeric
{
NSString *emailRegex = @"[0-9]+";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:self];
// NSString *localDecimalSymbol = [[NSLocale currentLocale] objectForKey:NSLocaleDecimalSeparator];
// NSMutableCharacterSet *decimalCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:localDecimalSymbol];
// [decimalCharacterSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
//
// NSCharacterSet* nonNumbers = [decimalCharacterSet invertedSet];
// NSRange r = [self rangeOfCharacterFromSet: nonNumbers];
//
// if (r.location == NSNotFound)
// {
// // check to see how many times the decimal symbol appears in the string. It should only appear once for the number to be numeric.
// int numberOfOccurances = [[self componentsSeparatedByString:localDecimalSymbol] count]-1;
// return (numberOfOccurances > 1) ? NO : YES;
// }
// else return NO;
}
स्विफ्ट 4 में:
let formatString = "12345"
if let number = Decimal(string:formatString){
print("String contains only number")
}
else{
print("String doesn't contains only number")
}
इसमें शामिल हैं: दशमलव भाग नियंत्रण (अनुमति दी गई दशमलवों की संख्या सहित), कॉपी / पेस्ट नियंत्रण, अंतर्राष्ट्रीय विभाजक।
कदम:
सुनिश्चित करें कि आपका दृश्य नियंत्रक UITextFieldDelegate से विरासत में मिला है
वर्ग MyViewController: UIViewController, UITextFieldDelegate {...
ViewDidLoad में, अपने नियंत्रण प्रतिनिधि को स्वयं पर सेट करें:
ओवरराइड func viewDidLoad () {super.viewDidLoad (); yourTextField.delegate = self}
निम्नलिखित विधि को लागू करें और यदि आप एक प्राकृतिक संख्या चाहते हैं, तो दशमलव या 0 की वांछित राशि के साथ "decsAllowed" स्थिरांक को अपडेट करें।
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let decsAllowed: Int = 2
let candidateText = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
let decSeparator: String = NumberFormatter().decimalSeparator!;
let splitted = candidateText.components(separatedBy: decSeparator)
let decSeparatorsFound = splitted.count - 1
let decimalPart = decSeparatorsFound > 0 ? splitted.last! : ""
let decimalPartCount = decimalPart.characters.count
let characterSet = NSMutableCharacterSet.decimalDigit()
if decsAllowed > 0 {characterSet.addCharacters(in: decSeparator)}
let valid = characterSet.isSuperset(of: CharacterSet(charactersIn: candidateText)) &&
decSeparatorsFound <= 1 &&
decsAllowed >= decimalPartCount
return valid
}
यदि बाद में आपको उस स्ट्रिंग को एक नंबर में सुरक्षित रूप से परिवर्तित करने की आवश्यकता है, तो आप केवल डबल (कैनस्ट्रिंग) या इंट (योरस्ट्रिंग) प्रकार कास्ट, या अधिक शैक्षणिक तरीके का उपयोग कर सकते हैं:
let formatter = NumberFormatter()
let theNumber: NSNumber = formatter.number(from: yourTextField.text)!
+ (BOOL) TextIsValidValue:(NSString*)newText:(double)&value:
...