如何在Objective-C中进行字符串转换?


145

我想将字符串转换为双精度型,并对其进行一些数学运算后,将其转换回字符串。

如何在Objective-C中执行此操作?

是否也可以将双精度舍入到最接近的整数?


除了克里斯·汉森(Chris Hanson)的答案,您还可以在《可可数据格式编程指南》中的Mac OS X 10.4上的NSNumberFormatter上找到有关数字格式器,其行为和格式字符串的更多信息。
mmalc

可能对您有用的另一种信息来源是有关NSNumberFormatter的文章:iphonesdkarticles.com/2008/11/…–
jpm

我认为官方文档非常不错...

Answers:


231

您可以将NSString转换为double

double myDouble = [myString doubleValue];

然后可以舍入到最接近的int

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

老实说,我不确定是否存在比将字符串转换回字符串更简化的方法

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

13
您不必这样做,因为不同的区域设置对数字的格式也不同。有些人会写“ 1000”为一千,而另一些人会写为“ 1,000”,而另一些人将写为“ 1.000”-从[[NSString doubleValue])中得到什么?
克里斯·汉森

9
Double是数字数据类型-它不包含任何格式。调用[NSString doubleValue]将返回1000,因为它只是一个数字。
安迪

12
NSString不能包含数字,只能包含数字的表示形式。该表示可以采用因地区而异的各种格式。
克里斯·汉森

5
您可能希望将@Barry Wark的答案整合到您的文档中,[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark 2011年

1
如果字符串值不是有效的双精度字符串,那么doubleValue将返回0.0。在我看来,建议使用NSNumberFormatter的解决方案更好,因为如果字符串不表示有效的双精度字符串,则返回nil。
凯德尔2014年

70

要真正将字符串正确地转换为数字,您需要使用NSNumberFormatter从中读取字符串的语言环境的configure 实例。

不同的区域设置将以不同的方式格式化数字。例如,在世界上的某些地区,COMMA它用作小数点分隔符,而在另一些地方,则用作小数点分隔符,而PERIOD千位分隔符(使用时)则相反。除非是空间。还是根本不存在。

这实际上取决于输入的来源。最安全的做法是NSNumberFormatter为输入的格式设置一种格式,并用于-[NSFormatter numberFromString:]从中获取格式NSNumber。如果要处理转换错误,则可以-[NSFormatter getObjectValue:forString:range:error:]改用。


2
或者,您可以使用本地化的扫描仪,例如使用[NSScanner localizedScannerWithString:]创建的扫描仪,然后[scanner scanDouble:&aDouble]将根据用户的当前语言环境进行扫描。
dreamlax

32

除了olliej的答案外,您还可以使用NSNumbers 从int转换回字符串stringValue

[[NSNumber numberWithInt:myInt] stringValue]

stringValueNSNumberinvokes上descriptionWithLocale:nil,为您提供值的本地化字符串表示形式。我不确定是否[NSString stringWithFormat:@"%d",myInt]会给您适当的本地化表示形式myInt


谢谢巴里。您发布的NSNumber到stringValue行对我有用,而NSString stringWithFormat却不行。
标记

7

olliej的舍入方法对于负数是错误的

  • 2.4的舍入为2(olliej的方法正确)
  • -2.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 2012年

numberFromString:返回一个NSNumber对象。请参阅Apple文档中的NumberFormattingNSNumberFormatter。(我不确定NSNumber对象如何编码“非数字”或“坏数字”,但我看到存在NSNull可能的值。)
miker 2012年

如果无法解析,则@BenClayton numberFromString返回一个nilNSNumber*。我无法重现您在使用领先空格和杂散字符时遇到的问题,IMO,它工作正常。" 28.5 "解析为28.5,和"gibberish28.5""28.5gibberish""gibberish28.5gibberish"都无法解析的; " 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的description方法转换为字符串)


2

对于四舍五入,您可能应该使用math.h中定义的C函数。

int roundedX = round(x);

按住Option键并双击roundXcode,它将显示手册页,其中包含用于舍入不同类型的各种功能的手册页。


1

这是我知道的最简单的方法:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;

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 myint=(int)(mydouble);

从双精度转换为字符串

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

要么

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

从int转换为string

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

要么

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

1

我最终使用了这个方便的宏:

#define STRING(value)               [@(value) stringValue]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.