【发布时间】:2014-02-17 17:13:49
【问题描述】:
在我的代码中,我正在处理一个包含 NSNumber 值的 NSString。此 NSNumber 值可能可能是一个重复的十进制数(例如 2.333333333e+06),它以字符串格式缩短为“2.333333”。它也可以是终止数(例如 2.5)、负数或无理数(2.398571892858...)(此处仅处理小数)
我需要有一种方法来确定字符串中是否有重复的数字(或 NSNumber,如果需要)。在我的代码中,我无法知道重复数字是多少,因为它是用户开始计算的结果。由于我对字符串索引/范围/长度缺乏经验,我已经尝试过这个 for 循环(见下文),它不能按照我想要的方式工作。
BOOL repeat = NO; //bool to check if repeating #
double repNum, tempNum; //run in for loop
NSString *repeating = [numVal stringValue]; //string that holds possible repeating #
for (int i = 3; i <= [repeating length]-3; i++) { //not sure about index/length here
if (i == 3) {
repNum = [repeating characterAtIndex:i];
}
tempNum = [repeating characterAtIndex:i];
if (tempNum == repNum) {
repeat = YES;
} else {
repeat = NO;
}
}
此代码无法正常工作,主要是因为我还必须考虑字符串中的负破折号和不同数量的数字(13 1/3 与 1 1/3)。我使用modf函数将整数与小数分开,但这对我来说也不是很好。
提前谢谢你。如果我能澄清任何事情,请告诉我。
编辑:
此代码适用于寻找多项式(二次公式)的不同解。希望这有助于将其置于上下文中。看这里。 (示例输入)
NSNumber *firstPlusSolution, *secondMinusSolution;
NSString *pValueStr, *mValueStr;
firstPlusSolution = -(b) + sqrt(square(b) - (4)*(a)*(c)); //a, b, c: "user" provided
firstPlusSolution /= 2*(a);
secondMinusSolution = -(b) - sqrt(square(b) - 4*(a)*(c));
secondMinusSolution /= 2*(a);
pValueStr = [firstPlusSolution stringValue];
mValueStr = [secondMinusSolution stringValue];
if ([NSString doesString:pValueStr containCharacter:'.']) { //category method I implemented
double fractionPart, integerPart;
fractionPart = modf(firstPlusSolution, &integerPart);
NSString *repeating = [NSString stringWithFormat:@"%g", fractionPart];
int repNum, tempNum;
BOOL repeat = NO;
//do for loop and check for negatives, integers, etc.
}
if ([NSString doesString:mValueStr containCharacter'.']) {
//do above code
//do for loop and check again
}
【问题讨论】:
-
“2.333333333e+06”如何缩短为“2.333333”?过程不清楚
-
另外,您是否希望检查字符串中的重复数字anywhere(这就是您的问题标题所暗示的)?比如 22222.3 和 2.33333 ?
-
@user2311023 在第一条评论中,它就是这样做的。从 NSNumber 到 NSString 的转换将它(至少对我来说)缩短为 2.33333。我认为这只是将值转换为另一个对象的一部分。第二条评论:不,对不起,只是小数。将进行编辑以使其更清晰。
-
你没有完全理解“重复数”的数学概念。仅仅因为一个数字以“67676767”结尾并不意味着它在数学意义上是“重复的”。可能是,或者下一个数字可能是 4。没有办法检查小数并判断它是否“重复”——要确定它是否“重复”,您必须检查生成数字的算法。
-
你不懂。简单地发现小数部分的已知数字重复并没有说明什么。 33333/10000 = 3.3333。但这不是数学意义上的“重复”数字,因为下一个数字是 0。10/3 也等于 3.3333,精度相同,但下一个数字(以及之后的每个数字)也将是 3。作为字符串,但是,您无法区分“3.3333”和“3.3333”。
标签: objective-c cocoa nsstring numbers nsnumber