147

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

我如何在 Objective-C 中做到这一点?

有没有办法将双精度数舍入到最接近的整数?

4

12 回答 12

234

您可以将 NSString 转换为双精度

double myDouble = [myString doubleValue];

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

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

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

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
于 2008-10-04T07:45:08.980 回答
71

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

不同的语言环境会以不同的方式格式化数字。例如,在世界的某些地方,COMMA它被用作小数分隔符,而在其他地方则被用作PERIOD- 并且千位分隔符(使用时)被颠倒了。除非它是一个空间。或者根本不存在。

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

于 2008-10-04T19:10:32.250 回答
33

添加到 olliej 的答案,您可以从 int 转换回带有NSNumber's的字符串stringValue

[[NSNumber numberWithInt:myInt] stringValue]

stringValueNSNumber调用上descriptionWithLocale:nil,为您提供值的本地化字符串表示。我不确定是否[NSString stringWithFormat:@"%d",myInt]会给您正确本地化的myInt.

于 2008-10-04T17:37:55.743 回答
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
于 2010-10-25T21:03:02.133 回答
7

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

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

这是一个替代方案

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

您当然可以使用 math.h 中的舍入函数

于 2008-10-04T07:57:15.383 回答
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];
于 2012-08-01T10:37:27.830 回答
3

对于从数字到字符串的转换,使用新的文字语法(XCode >= 4.4)怎么样,它更紧凑一点。

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

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

(将其装箱为NSNumber并使用NSObjects 的描述方法转换为字符串)

于 2012-12-04T13:07:41.877 回答
2

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

int roundedX = round(x);

按住 Option 并在 Xcode 中双击round,它会显示手册页,其中包含用于舍入不同类型的各种函数。

于 2008-10-06T21:30:02.280 回答
1

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

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
于 2009-06-06T19:38:01.803 回答
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);
于 2010-12-14T19:14:21.077 回答
1

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

#define STRING(value)               [@(value) stringValue]
于 2013-01-23T15:16:14.397 回答
1

将文本字段中输入的文本转换为整数

double mydouble=[_myTextfield.text doubleValue];

四舍五入到最接近的双精度

mydouble=(round(mydouble));

四舍五入到最接近的 int(仅考虑正值)

int myint=(int)(mydouble);

从双精度转换为字符串

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];
于 2013-02-24T12:42:56.770 回答