जांचें कि UITextField के लिए एक इनपुट केवल संख्यात्मक है


82

मैं स्ट्रिंग इनपुट को कैसे मान्य करूँ UITextField? मैं यह जांचना चाहता हूं कि स्ट्रिंग दशमलव अंक सहित संख्यात्मक है।

जवाबों:


35

मैं अपने मैक ऐप में इस कोड का उपयोग करता हूं, समान या समान आईफोन के साथ काम करना चाहिए। यह 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]];
    }
}

7
हाँ, यह एक बहुत पुराना जवाब है, मुझे पता है, लेकिन मुझे लगा कि स्थैतिक तरीके इस तरह घोषित किए गए थे: + (BOOL) TextIsValidValue:(NSString*)newText:(double)&value:...
RCIX

7
TextIsValidValue एक स्थिर C फ़ंक्शन है, जिसका अर्थ है फ़ाइल के लिए इसका स्थानीय और किसी भी ऑब्जेक्ट का हिस्सा नहीं है। आप (@RCIX) एक ऑब्जेक्ट विधि का वर्णन कर रहे हैं, जो C ++ में एक स्थिर विधि के समान है और एक स्थिर C फ़ंक्शन (या उस मामले के लिए एक स्थिर चर!) के लिए एक पूरी तरह से अलग अवधारणा है।
पीटर एन लुईस

अभिव्यक्ति रिक्त स्ट्रिंग (जो संख्यात्मक नहीं है) से मेल खाती है।
निकोलाई रुहे जूल

आम तौर पर, इनपुट के लिए एक संख्या के मिलान के लिए, आपको खाली स्ट्रिंग की अनुमति देने की आवश्यकता होती है, अन्यथा उपयोगकर्ता उदाहरण के लिए, "1 <हटाएं" 2 "टाइप नहीं कर सकता है।
पीटर एन लुईस

6
उन डेवलपर्स के लिए जो रेगेक्स नहीं जानते हैं या वे कैसे काम करते हैं, बस इस रेगेक्स डिकोडर वेसबाइट पर जाएं और (?:|0|[1-9]\\d*)(?:\\.\\d*)इसका मतलब देखने के लिए कॉपी / पेस्ट करें। इसके अलावा Regex Wikipedia
Honey

117

आप इसे कुछ लाइनों में इस तरह से कर सकते हैं:

BOOL valid;
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:myInputField.text];
valid = [alphaNums isSupersetOfSet:inStringSet];    
if (!valid) // Not numeric

- यह इनपुट को मान्य करने के लिए है केवल संख्यात्मक वर्ण है। NSCharacterSetअन्य विकल्पों के लिए दस्तावेज़ देखें। मान्य इनपुट वर्णों के किसी भी सेट को निर्दिष्ट करने के लिए आप characterSetWithCharactersInString का उपयोग कर सकते हैं।


22
यह उत्तर युगल या विराम चिह्न की जाँच नहीं करता है
zambono

72

ऐसा करने के कुछ तरीके हैं:

  1. NSNumberFormatter की संख्या का उपयोग करेंफ्रेमस्ट्रिंग: विधि। यदि यह स्ट्रिंग को सही ढंग से पार्स कर सकता है, या nilयदि यह नहीं कर सकता है तो यह एक NSNumber लौटा देगा ।
  2. NSScanner का उपयोग करें
  3. किसी भी गैर-संख्यात्मक चरित्र को स्ट्रिप करें और देखें कि क्या स्ट्रिंग अभी भी मेल खाती है
  4. एक नियमित अभिव्यक्ति का उपयोग करें

IMO, जैसे कुछ का उपयोग -[NSString doubleValue]करना सबसे अच्छा विकल्प नहीं होगा क्योंकि दोनों @"0.0"का @"abc"डबल होगा और 0. का एक डबल वेल्यू होगा। * वैल्यू मेथड्स सभी रिटर्न 0 हैं यदि वे स्ट्रिंग को ठीक से कन्वर्ट करने में सक्षम नहीं हैं, तो एक के बीच अंतर करना मुश्किल होगा की वैध स्ट्रिंग @"0"और गैर-वैध स्ट्रिंग। सी के strtolफंक्शन जैसा ही कुछ मुद्दा होगा।

मुझे लगता है कि NSNumberFormatter का उपयोग करना सबसे अच्छा विकल्प होगा, क्योंकि यह लोकेल को ध्यान में रखता है (यानी, @"1,23"यूरोप में संख्या , @"1.23"संयुक्त राज्य अमेरिका में)।


हम्म, मुझे NSNumberFormatter के लिए विकल्पों को गलत तरीके से सेट करना होगा। जब मैं स्ट्रिंग "34jfkjdskj80" का उपयोग करके नंबरफ्रॉमस्ट्रिंग का उपयोग करता हूं तो यह संख्या 3480 वापस आ जाएगी। यह शून्य वापस करने के बजाय पात्रों को छीनने लगता है।
टोनी आइचेल्बर

5
@ हाँ, मुझे यकीन नहीं है कि आप क्या कर रहे हैं, क्योंकि मेरे लिए निम्नलिखित लॉग "N: (null)" है:NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; NSNumber * n = [f numberFromString:@"34jfkjdskj80"]; NSLog(@"N: %@", n);
डेव डोंगलॉन्ग

2
यह थोड़ा पुराना है, लेकिन अगर कोई इसे पढ़ रहा है, तो मैंने सोचा कि यह ध्यान देने योग्य होना चाहिए कि ए NSScanner, जैसे NSNumberFormatter, स्ट्रिंग को पार्स करते समय लोकेल को ध्यान में रखता है, बशर्ते आप setLocale:स्कैनर ऑब्जेक्ट पर उपयोग करें (उदाहरण के लिए, आप प्रदान कर सकते हैं) [NSLocale currentLocale])।
ड्रीमलैक्स

1
कुछ लोग "वॉर एंड पीस" पढ़ते हैं। अन्य लोग "मोबी डिक" पसंद करते हैं। अपने आप से, मुझे लगता है कि मैं सिर्फ स्टैक ओवरफ्लो डेटा सेट को नीचे खींचने जा रहा हूं, डेव के उत्तरों के साथ प्रश्नों को फ़िल्टर करें, और बस आनंद लें।
बी.पी.

1
@ मार्की हाँ, आप उस व्यवहार पर भरोसा कर सकते हैं। यद्यपि यह प्रलेखित नहीं किया जा सकता है, कि यह कई वर्षों से कैसे व्यवहार किया गया है, और इसे बदलना एक बाइनरी संगतता बिंदु से देखने योग्य होगा।
डेव डोंगलांग

19

यदि आप चाहते हैं कि एक उपयोगकर्ता को केवल अंकों में प्रवेश करने की अनुमति दी जाए, तो आप अपने 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];
}

शायद अधिक कुशल तरीके हैं, लेकिन मुझे यह बहुत सुविधाजनक तरीका लगता है। और युगल या जो कुछ भी मान्य करने के लिए विधि आसानी से अनुकूल होनी चाहिए: बस स्कैनडबल का उपयोग करें: या इसी तरह।


13
#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;
}

11

यहाँ कुछ वन-लाइनर्स हैं जो उपरोक्त पीटर लुईस के उत्तर को जोड़ते हैं ( जाँचें कि 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]

कृपया मुझे एक लिंक प्रदान करें जहाँ से मैं इसके बारे में अधिक जान सकूँ।
स्मित सरैया

4

पूर्णांक परीक्षण के लिए यह होगा:

- (BOOL) isIntegerNumber: (NSString*)input
{
    return [input integerValue] != 0 || [input isEqualToString:@"0"];
}

अच्छा जवाब, लेकिन फिर भी इस दृष्टिकोण के साथ समस्या इनपुट मान '232asdfsadf' की होगी, जिसे संख्या माना जाता है।
18

आप लंबाई की तुलना कर सकते हैं integerValue (फिर से स्ट्रिंग में परिवर्तित करें) मूल स्ट्रिंग के खिलाफ "123aoenuthr" को पूर्णांक नहीं माना जाता है।
माइकल

3

आप अपने स्ट्रिंग के doubleValue का उपयोग कर सकते हैं जैसे

NSString *string=@"1.22";
double a=[string doubleValue];

मुझे लगता है कि यह 0.0 के रूप में वापस आ जाएगा यदि स्ट्रिंग अमान्य है (यह एक अपवाद फेंक सकता है, तो जिस स्थिति में आप इसे पकड़ सकते हैं, डॉक्स 0.0 tho कहते हैं)। अधिक जानकारी यहाँ


साथ ही, लाइब्रेरी फ़ंक्शन का उपयोग करना आमतौर पर अपने स्वयं के रोल करने से बेहतर होता है। इस स्थिति में, अन्य संस्कृतियाँ दशमलव बिंदु के लिए अल्पविराम का उपयोग करती हैं, और संभवतः कोको के परिवाद ही इसे संभाल सकते हैं।
किबिबू

उल्लेख नहीं करने के लिए शाब्दिक नाव समानता तुलना करना सिर्फ बुरा अभ्यास है
एम। रेयान

3

नमस्ते में ठीक वैसी ही समस्या थी और मैंने जो उत्तर पोस्ट किया था, उसे यहाँ नहीं देखा, इसलिए यहाँ है।

मैंने आईबी के माध्यम से अपने पाठ क्षेत्र को बनाया और जुड़ा। जब मैंने इसे कंट्रोल + ड्रैग के माध्यम से अपने कोड से जोड़ा, तो मैंने एक्शन को चुना, फिर एडिटिंग चेंजेड इवेंट को चुना। यह प्रत्येक वर्ण प्रविष्टि पर विधि को ट्रिगर करता है। आप सूट करने के लिए एक अलग घटना का उपयोग कर सकते हैं।

बाद में, मैंने पाठ को बदलने के लिए इस सरल कोड का उपयोग किया। ध्यान दें कि मैंने दशमलव / अवधि वर्ण और संख्याओं को शामिल करने के लिए अपना स्वयं का वर्ण बनाया है। मूल रूप से अमान्य वर्णों पर स्ट्रिंग को अलग करता है, फिर उन्हें खाली स्ट्रिंग के साथ जोड़ देता है।

- (IBAction)myTextFieldEditingChangedMethod:(UITextField *)sender {
        NSCharacterSet *validCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];
        NSCharacterSet *invalidCharacterSet = validCharacterSet.invertedSet;
        sender.text = [[sender.text componentsSeparatedByCharactersInSet:invalidCharacterSet] componentsJoinedByString:@""];
}

क्रेडिट: NSString से सभी लेकिन संख्याओं को हटा दें


नकारात्मक संख्या (-)?
CMVR

3

खेल के अंत में लेकिन यहाँ एक आसान सा वर्ग है जिसका उपयोग मैं दशमलव स्थानों और उसके लिए उपयोग किए जाने वाले स्थानीय प्रतीक के लिए करता हूँ। इसका सार यहाँ लिंक करें

@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

क्या अल्फ़ान्यूमेरिकच्रेचर नहीं होना चाहिए? मैं इसका उपयोग कैसे करता हूं।
आंद्रेई रादुलेस्कु

काम नहीं, @ "A" का परिणाम मिलता है। नाममात्र हां, लेकिन यह एक नंबर नहीं है
Gank

3
- (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;
}

3

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];
  }
}

1
कॉपी और पेस्ट करने की क्षमता के बारे में मत भूलना - आपका दृष्टिकोण इस मामले में विफल रहता है
slxl

1
यह सभी मामलों को संबोधित नहीं करता है। एक उपयोगकर्ता पेस्ट टेक्स्ट कॉपी कर सकता है या ब्लूटूथ कीबोर्ड का उपयोग कर सकता है।
बीन

2
@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;
  }
}

2

पुराना धागा, लेकिन यह ध्यान देने योग्य है कि Apple ने NSRegularExpressioniOS 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उदाहरण कहीं और संग्रहीत करें ।


1

मैं एक पाठ क्षेत्र चाहता था जो केवल पूर्णांकों की अनुमति देता हो। यहाँ मैंने क्या किया (यहाँ और अन्य जगहों से जानकारी का उपयोग करके):

पूर्णांक संख्या फ़ॉर्मेटर बनाएं (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;
}

1

इतना सुंदर, लेकिन सरल नहीं है :)

- (BOOL) isNumber: (NSString*)input
{
    return [input doubleValue] != 0 || [input isEqualToString:@"0"] || [input isEqualToString:@"0.0"];
}

1
यह समाधान 0.00 की तरह अनंत शून्य के साथ काम नहीं करता है। इसलिए मैं इसका उपयोग करने वाले लोगों को सुझाव नहीं दूंगा
विन

1

स्विफ्ट 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
            }
        }
    }

0

अधिक अंतरराष्ट्रीय होने के लिए (और केवल यूएस रंगीन;;) केवल ऊपर दिए गए कोड में प्रतिस्थापित न करें

-(NSNumber *) getNumber
{
  NSString* localeIdentifier = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
  NSLocale *l_en = [[NSLocale alloc] initWithLocaleIdentifier: localeIdentifier] ;
  return [self getNumberWithLocale: [l_en autorelease] ];
}

0

यह उत्तर 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

मुझे उम्मीद है कि यह किसी की मदद करता है। =)


0
   #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;
    }

0

स्विफ्ट 4 में:

let formatString = "12345"
if let number = Decimal(string:formatString){

    print("String contains only number")
}
else{
    print("String doesn't contains only number")
}

0

इसमें शामिल हैं: दशमलव भाग नियंत्रण (अनुमति दी गई दशमलवों की संख्या सहित), कॉपी / पेस्ट नियंत्रण, अंतर्राष्ट्रीय विभाजक।

कदम:

  1. सुनिश्चित करें कि आपका दृश्य नियंत्रक UITextFieldDelegate से विरासत में मिला है

    वर्ग MyViewController: UIViewController, UITextFieldDelegate {...

  2. ViewDidLoad में, अपने नियंत्रण प्रतिनिधि को स्वयं पर सेट करें:

    ओवरराइड func viewDidLoad () {super.viewDidLoad (); yourTextField.delegate = self}

  3. निम्नलिखित विधि को लागू करें और यदि आप एक प्राकृतिक संख्या चाहते हैं, तो दशमलव या 0 की वांछित राशि के साथ "decsAllowed" स्थिरांक को अपडेट करें।

स्विफ्ट 4

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)!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.