【发布时间】:2010-09-15 06:10:25
【问题描述】:
我想把一个字符串转换成一个双精度数,在对它做一些数学运算后,把它转换回一个字符串。
如何在 Objective-C 中做到这一点?
有没有办法将双精度数四舍五入到最接近的整数?
【问题讨论】:
标签: objective-c
我想把一个字符串转换成一个双精度数,在对它做一些数学运算后,把它转换回一个字符串。
如何在 Objective-C 中做到这一点?
有没有办法将双精度数四舍五入到最接近的整数?
【问题讨论】:
标签: objective-c
您可以使用
将 NSString 转换为 doubledouble myDouble = [myString doubleValue];
四舍五入到最近的 int 可以这样完成
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
老实说,我不确定是否有比转换回字符串更简化的方法
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
【讨论】:
[[NSNumber numberWithInt:myInt] stringValue]
要真正正确地将字符串转换为数字,您需要使用为您正在读取字符串的语言环境配置的NSNumberFormatter 实例。
不同的语言环境会以不同的方式格式化数字。例如,在世界的某些地方,COMMA 用作小数分隔符,而在其他地方则使用 PERIOD — 并且千位分隔符(使用时)被颠倒了。除非它是一个空间。或者根本不存在。
这实际上取决于输入的来源。最安全的做法是为输入的格式配置NSNumberFormatter,并使用-[NSFormatter numberFromString:] 从中获取NSNumber。如果要处理转换错误,可以改用-[NSFormatter getObjectValue:forString:range:error:]。
【讨论】:
添加到 olliej 的答案,您可以使用 NSNumber's stringValue 从 int 转换回字符串:
[[NSNumber numberWithInt:myInt] stringValue]
NSNumber 上的stringValue 调用descriptionWithLocale:nil,为您提供值的本地化字符串表示。我不确定[NSString stringWithFormat:@"%d",myInt] 是否会为您提供正确本地化的myInt 表示。
【讨论】:
这是 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
【讨论】:
NSNumber* 的 nil。我无法重现您在前导空格和杂散文本字符方面遇到的问题,IMO 它工作正常。 " 28.5 "解析为28.5,而"gibberish28.5"、"28.5gibberish"、"gibberish28.5gibberish"都是不可解析的; " 2 8 . 5. " 无法解析,但这并不罕见。
olliej 的rounding 方法对于负数是错误的
这是另一种选择
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
您当然可以使用 math.h 中的舍入函数
【讨论】:
// 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];
【讨论】:
对于从数字到字符串的转换,如何使用新的文字语法(XCode >= 4.4),它更紧凑一些。
int myInt = (int)round( [@"1.6" floatValue] );
NSString* myString = [@(myInt) description];
(将其封装为NSNumber 并使用NSObjects' description method 转换为字符串)
【讨论】:
对于舍入,您可能应该使用 math.h 中定义的 C 函数。
int roundedX = round(x);
按住 Option 并双击 Xcode 中的round,它会显示手册页,其中包含用于舍入不同类型的各种函数。
【讨论】:
这是我所知道的最简单的方法:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
【讨论】:
从这里的示例中,您可以看到两种方式的转换:
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);
【讨论】:
将文本字段中输入的文本转换为整数
double mydouble=[_myTextfield.text doubleValue];
四舍五入到最接近的双精度
mydouble=(round(mydouble));
四舍五入到最接近的整数(只考虑正值)
int myint=(int)(mydouble);
从双精度转换为字符串
myLabel.text=[NSString stringWithFormat:@"%f",mydouble];
或
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
从整数转换为字符串
myLabel.text=[NSString stringWithFormat:@"%d",myint];
或
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
【讨论】:
我最终使用了这个方便的宏:
#define STRING(value) [@(value) stringValue]
【讨论】: