如何将字符串转换为双精度浮点数,以及如何将双精度浮点数转换为字符串?

147
我希望将一个字符串转换为double类型,在进行一些数学运算后,再将其转换回字符串。
在Objective-C中该如何操作?
是否有一种方法可以将double四舍五入到最近的整数?
答案:
我想要将字符串转换成浮点型,之后进行一些数学运算,再将其转回字符串。
在Objective-C中应如何实现?
同时,是否有一种方法可以将浮点型取整到最接近的整数?
12个回答

235

您可以使用以下方法将NSString转换为double:

double myDouble = [myString doubleValue];

将数字四舍五入到最接近的整数可以通过以下方式实现

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

老实说,我不确定是否有一种更简化的方式将其转换回字符串。

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

14
由于不同的语言环境会以不同的方式格式化数字,因此您不一定希望这样做。有些语言环境会将“1000”写成“一千”,而其他语言环境会写成“1,000”或“1.000”。-[NSString doubleValue]方法返回的结果是哪种格式的数字呢? - Chris Hanson
9
Double是一种数字数据类型,它不包含任何格式。调用[NSString doubleValue]会返回1000,因为它只是一个数字。 - Andy
13
一个NSString不能包含数字,只能包含数字的表达方式。这种表达方式可能采用各种因区域而异的格式。 - Chris Hanson
5
你可能希望将 @Barry Wark 的答案与你的答案结合起来,使用 [[NSNumber numberWithInt:myInt] stringValue] 这段代码。 - Dan Rosenstark
1
如果字符串值不是有效的双精度字符串,那么doubleValue将返回0.0。我认为建议使用NSNumberFormatter的解决方案更好,因为如果字符串不表示有效的双精度字符串,则返回nil。 - Kaydell
我同意@Kaydell的观点,这个解决方案似乎使得在字符串无法被解析为double时无法进行任何真正的错误处理(因为0.0是一个有效且合理的double),这将严重限制此策略可以处理的应用程序数量。 - jrh

72
为了正确地将字符串转换为数字,您需要使用一个已配置为从读取字符串的区域设置中获取格式的NSNumberFormatter实例。
不同的区域会以不同的方式格式化数字。例如,在世界上某些地方,使用逗号作为小数分隔符,而在其他地方则使用句点,而千位分隔符(如果使用)则是反向的。除非它是空格。或者根本不存在。
这真的取决于输入来源。最安全的做法是为您的输入格式配置一个NSNumberFormatter,并使用-[NSFormatter numberFromString:]从中获取NSNumber。如果您想处理转换错误,则可以使用-[NSFormatter getObjectValue:forString:range:error:]

2
或者,您可以使用本地化的扫描器,例如使用[NSScanner localizedScannerWithString:]创建的扫描器,然后[scanner scanDouble:&aDouble]将根据用户当前的区域设置扫描一个双精度数。 - dreamlax

33

补充olliej的答案,您可以使用NSNumberstringValue将int转换回字符串:

[[NSNumber numberWithInt:myInt] stringValue]
NSNumber上的stringValue方法会调用descriptionWithLocale:nil,从而为您提供一个本地化的值字符串表示。我不确定[NSString stringWithFormat:@"%d",myInt]是否能够给您一个正确本地化的myInt表示。

8
这是一个NSNumberFormatter读取本地化数字字符串的工作示例(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对象。请参阅NumberFormattingNSNumberFormatter在苹果文档中。 (我不确定NSNumber对象如何编码“非数字”或“错误数字”,但我看到有一个NSNull可能的值。) - miker
@BenClayton 如果无法解析,则numberFromString返回值为nilNSNumber*。我无法重现您在前导空格和杂散文本字符方面遇到的问题,我认为它正在正常工作。 " 28.5 " 解析为28.5,而 "gibberish28.5""28.5gibberish""gibberish28.5gibberish" 都无法解析; " 2 8 . 5. " 无法解析,但这并不罕见。 - jrh

7

olliej的四舍五入方法对负数不正确

  • 2.4四舍五入为2(olliej的方法是正确的)
  • −2.4四舍五入为−2(olliej的方法返回-1)

这里有一个替代方法

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

你当然可以使用 math.h 中的四舍五入函数。


3

如果要将数字转换为字符串,可以尝试使用新的文字语法(XCode >= 4.4),它更加紧凑。

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

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

将其封装为NSNumber,并使用NSObjects的description方法将其转换为字符串。


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

2

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

int roundedX = round(x);

按住Option键并在Xcode中双击round,它会显示出舍入不同类型的各种函数的man页面。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接