วิธีการแปลงสตริงใน Objective-C


145

ฉันต้องการแปลงสตริงให้เป็นสองเท่าและหลังจากทำการคำนวณทางคณิตศาสตร์แล้วให้แปลงกลับเป็นสตริง

ฉันจะทำสิ่งนี้ใน Objective-C ได้อย่างไร

มีวิธีการปัดเศษเป็นสองเท่าเป็นจำนวนเต็มที่ใกล้เคียงด้วยหรือไม่?


นอกจากจะตอบคริสแฮนสัน, คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับการจัดรูปแบบจำนวนพฤติกรรมของพวกเขาและสตริงรูปแบบจากNSNumberFormatter บน Mac OS X 10.4ในข้อมูลการจัดรูปแบบการเขียนโปรแกรมคำแนะนำสำหรับโกโก้
mmalc

แหล่งที่มาอีกอย่างหนึ่งของข้อมูลที่อาจเป็นประโยชน์กับคุณคือบทความนี้เกี่ยวกับ NSNumberFormatter: iphonesdkarticles.com/2008/11/...
JPM

ฉันคิดว่าเอกสารอย่างเป็นทางการนั้นค่อนข้างดี ...

คำตอบ:


231

คุณสามารถแปลง NSString เป็นคู่ด้วย

double myDouble = [myString doubleValue];

การปัดเศษเป็น int ที่ใกล้ที่สุดสามารถทำได้ดังนี้

int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

ฉันไม่แน่ใจว่าหากมีวิธีที่คล่องตัวกว่าในการแปลงกลับเป็นสตริงมากกว่า

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];

13
คุณไม่จำเป็นต้องทำเช่นนี้เพราะหมายเลขรูปแบบโลแคลต่างกันต่างกัน บางคนจะเขียน "1,000" สำหรับหนึ่งพันในขณะที่คนอื่นจะเขียน "1,000" และอื่น ๆ "1.000" - คุณได้จาก - [NSString doubleValue]
Chris Hanson

9
Double เป็นประเภทข้อมูลตัวเลข - ไม่มีการจัดรูปแบบใด ๆ การเรียก [NSString doubleValue] จะคืนค่า 1,000 เพราะมันเป็นเพียงตัวเลข
Andy

12
และ NSString ไม่สามารถมีตัวเลขเพียงการแสดงตัวเลข การเป็นตัวแทนนั้นอาจอยู่ในรูปแบบที่หลากหลายที่แตกต่างกันตามตำแหน่งที่ตั้ง
Chris Hanson

5
คุณอาจต้องการรวมคำตอบของ @Barry Wark ในของคุณ[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark

1
จะทำอย่างไรถ้าค่าสตริงไม่ใช่สตริงคู่ที่ถูกต้องดังนั้น 0.0 จะถูกส่งคืนโดย doubleValue สำหรับฉันแล้วดูเหมือนว่าวิธีแก้ปัญหาที่แนะนำให้ใช้ NSNumberFormatter นั้นดีกว่าเพราะถ้าสตริงไม่ได้แสดงถึงสตริงคู่ที่ถูกต้องดังนั้น nil จะถูกส่งกลับ
Kaydell

70

ในการแปลงจากสตริงเป็นจำนวนจริงอย่างถูกต้องคุณต้องใช้อินสแตนซ์ของNSNumberFormatterการกำหนดค่าสำหรับสถานที่ที่คุณกำลังอ่านสตริง

ตำแหน่งที่ตั้งอื่นจะจัดรูปแบบตัวเลขต่างกัน ตัวอย่างเช่นในบางส่วนของโลกCOMMAจะใช้เป็นตัวคั่นทศนิยมขณะที่อยู่ในส่วนอื่น ๆ คือPERIOD- และตัวคั่นหลักพัน (เมื่อใช้) จะถูกย้อนกลับ ยกเว้นเมื่อเป็นพื้นที่ หรือไม่ปรากฏเลย

มันขึ้นอยู่กับที่มาของอินพุต สิ่งที่ปลอดภัยที่สุดที่จะทำคือการกำหนดค่าNSNumberFormatterสำหรับวิธีการจัดรูปแบบการป้อนข้อมูลของคุณและใช้-[NSFormatter numberFromString:]เพื่อรับNSNumberจากมัน หากคุณต้องการจัดการข้อผิดพลาดในการแปลงคุณสามารถใช้-[NSFormatter getObjectValue:forString:range:error:]แทน


2
หรือคุณสามารถใช้สแกนเนอร์ที่แปลเป็นภาษาท้องถิ่นตัวอย่างเช่นที่สร้างขึ้นด้วย [NSScanner localizedScannerWithString:] แล้ว [สแกนเนอร์สแกนคู่: & aDouble] จะสแกนเป็นสองเท่าตามตำแหน่งที่ตั้งปัจจุบันของผู้ใช้
dreamlax

32

เพิ่มคำตอบ olliej ของคุณสามารถแปลงจาก int กลับไปสตริงกับNSNumber's stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValueในการNSNumberเรียกใช้descriptionWithLocale:nilให้การแทนค่าสตริงที่แปลแล้ว ฉันไม่แน่ใจว่า[NSString stringWithFormat:@"%d",myInt]จะให้คำตอบแก่คุณเป็นภาษาท้องถิ่นmyIntหรือไม่


ขอบคุณ Barry สาย NSNumber to stringValue ที่คุณโพสต์ทำงานให้ฉันในขณะที่ NSString stringWithFormat ไม่ได้
ทำเครื่องหมาย

7

วิธีการปัดเศษ olliej นั้นผิดสำหรับจำนวนลบ

  • 2.4 ปัดเศษเป็น 2 (วิธีของ olliej ทำให้ถูกต้อง)
  • rounded2.4 ปัดเศษเป็น −2 (เมธอด olliej ส่งคืน -1)

นี่คือทางเลือก

  int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

แน่นอนคุณสามารถใช้ฟังก์ชันการปัดเศษจาก math.h


7

ต่อไปนี้เป็นตัวอย่างการทำงานของ NSNumberFormatter ที่อ่านการแปลหมายเลข String (xCode 3.2.4, osX 10.6) เพื่อประหยัดเวลาอื่น ๆ ที่ฉันเพิ่งทำไป ระวัง: ในขณะที่สามารถจัดการกับช่องว่างต่อท้ายเช่น "8,765.4" นี้ไม่สามารถจัดการกับพื้นที่สีขาวชั้นนำและสิ่งนี้ไม่สามารถจัดการกับตัวอักษรข้อความหลงทาง (สตริงอินพุตไม่ถูกต้อง: "8" และ "8q" และ "8 q")

NSString *tempStr = @"8,765.4";  
     // localization allows other thousands separators, also.
NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
[myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
[myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
     // next line is very important!
[myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial

NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'", 
    tempStr, tempNum, [tempNum intValue]);
[myNumFormatter release];  // good citizen

1
numberFromString ส่งคืนอะไรถ้าสตริงไม่ใช่สตริงที่ถูกต้อง
Ben Clayton

numberFromString: ส่งคืนวัตถุ NSNumber ดูที่NumberFormattingและNSNumberFormatterใน apple docs (ฉันไม่แน่ใจว่าวัตถุ NSNumber เข้ารหัส "ไม่ได้เป็นจำนวน" หรือ "จำนวนไม่ดี" แต่ฉันเห็นมีค่าที่เป็นไปได้ NSNull.)
miker

@BenClayton numberFromString ส่งคืนค่าที่มีnilค่าNSNumber*หากไม่สามารถแยกวิเคราะห์ได้ ฉันไม่สามารถทำซ้ำปัญหาที่คุณมีกับพื้นที่ว่างสีขาวและอักขระข้อความจรจัดชั้นนำได้ IMO ทำงานได้อย่างถูกต้อง " 28.5 "แยกวิเคราะห์เป็น 28.5 และ"gibberish28.5" , "28.5gibberish"และ"gibberish28.5gibberish"มีทั้งหมด unparseable; " 2 8 . 5. "ไม่สามารถแยกวิเคราะห์ได้ แต่ก็ไม่ได้ผิดปกติ
jrh

3
// Converting String in to Double

double doubleValue = [yourString doubleValue];

// Converting Double in to String
NSString *yourString = [NSString stringWithFormat:@"%.20f", doubleValue];
// .20f takes the value up to 20 position after decimal

// Converting double to int

int intValue = (int) doubleValue;
or
int intValue = [yourString intValue];

3

สำหรับการแปลงจากตัวเลขเป็นสตริงวิธีการเกี่ยวกับการใช้ไวยากรณ์ตัวอักษรใหม่ (XCode> = 4.4) มันมีขนาดกะทัดรัดกว่าเล็กน้อย

int myInt = (int)round( [@"1.6" floatValue] );

NSString* myString = [@(myInt) description];

(ทำกล่องเป็นNSNumberและแปลงเป็นสตริงโดยใช้วิธีการอธิบายของ NSObjects )


2

สำหรับการปัดเศษคุณควรใช้ฟังก์ชัน C ที่กำหนดไว้ใน math.h

int roundedX = round(x);

กดตัวเลือกค้างไว้แล้วดับเบิลคลิกที่roundXcode และมันจะแสดง man page ที่มีฟังก์ชั่นต่าง ๆ สำหรับการปัดเศษประเภทต่างๆ



1

จากตัวอย่างนี้ที่นี่คุณสามารถเห็นการแปลงทั้งสองวิธี:

NSString *str=@"5678901234567890";

long long verylong;
NSRange range;
range.length = 15;
range.location = 0;

[[NSScanner scannerWithString:[str substringWithRange:range]] scanLongLong:&verylong];

NSLog(@"long long value %lld",verylong);

1

แปลงข้อความที่ป้อนในฟิลด์ข้อความเป็นจำนวนเต็ม

double mydouble=[_myTextfield.text doubleValue];

ปัดเศษเป็นสองเท่าที่ใกล้ที่สุด

mydouble=(round(mydouble));

การปัดเศษเป็น int ที่ใกล้ที่สุด (พิจารณาเฉพาะค่าบวก)

int myint=(int)(mydouble);

การแปลงจาก double เป็น string

myLabel.text=[NSString stringWithFormat:@"%f",mydouble];

หรือ

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

การแปลงจาก int เป็นสตริง

myLabel.text=[NSString stringWithFormat:@"%d",myint];

หรือ

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.