关于cocoa:如何在Objective-C中进行字符串转换?

How to do string conversions in Objective-C?

我想把一个字符串转换成一个双精度字符串,在对它做了一些数学运算后,将它转换回一个字符串。

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

有没有办法把一个双精度数也四舍五入为最接近的整数?


可以将nsstring转换为double,

1
double myDouble = [myString doubleValue];

四舍五入到最近的整数,然后可以这样做

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

老实说,我不确定是否有比

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


要正确地将字符串转换为数字,您需要使用为从中读取字符串的区域设置配置的NSNumberFormatter实例。

不同的地区将不同的格式数字。例如,在世界上的某些地方,COMMA用作十进制分隔符,而在其他地方则用作PERIOD,而千位分隔符(使用时)则相反。除非是空间。或者根本不在场。

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


除了Olliej的答案外,您还可以使用NSNumberstringValue将int转换回字符串:

1
[[NSNumber numberWithInt:myInt] stringValue]

NSNumber上的stringValue调用descriptionWithLocale:nil,为您提供值的本地化字符串表示。我不确定[NSString stringWithFormat:@"%d",myInt]是否会给你一个适当的myInt的本地化表示。


下面是一个nsnumberFormatter的工作示例,它读取本地化的数字字符串(xcode 3.2.4,osx 10.6),以节省其他人刚刚花在这上面的时间。注意:虽然它可以处理诸如"8765.4"之类的尾随空格,但它不能处理前导空格,也不能处理多余的文本字符。(错误的输入字符串:"8"和"8q"以及"8q"。)

1
2
3
4
5
6
7
8
9
10
11
12
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


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

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

这是另一种选择

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

你当然可以用数学中的四舍五入函数。


1
2
3
4
5
6
7
8
9
10
11
12
13
// 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),它有点紧凑。

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

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

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


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

1
int roundedX = round(x);

按住选项,双击xcode中的round,将显示具有不同类型取整功能的手册页。


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

1
double mydouble=[_myTextfield.text doubleValue];

四舍五入到最近的双精度

1
mydouble=(round(mydouble));

四舍五入到最近的整数(只考虑正值)

1
int myint=(int)(mydouble);

从double转换为string

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

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

从int转换为string

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

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

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

1
#define STRING(value)               [@(value) stringValue]

在此示例中,您可以看到两种转换方式:

1
2
3
4
5
6
7
8
9
10
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
2
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;