Objective c NSString中任意重复十进制数的计数

Objective c NSString中任意重复十进制数的计数,objective-c,cocoa,nsstring,numbers,nsnumber,Objective C,Cocoa,Nsstring,Numbers,Nsnumber,在我的代码中,我正在处理一个包含NSNumber值的NSString。此NSNumber值可能是一个重复的十进制数(e.x.2.333 e+06),以字符串格式缩短为“2.333333”。它也可以是终止数(e.x.2.5)、负数或无理数(2.398571892858…)(此处仅处理小数) 我需要有一种方法来确定字符串中是否有重复的数字(或者NSNumber,如果需要的话)。在我的代码中,我无法知道重复的数字是什么,因为它是用户开始计算的结果。由于我对字符串索引/范围/长度缺乏经验,我尝试了这个f

在我的代码中,我正在处理一个包含NSNumber值的NSString。此NSNumber值可能是一个重复的十进制数(e.x.2.333 e+06),以字符串格式缩短为“2.333333”。它也可以是终止数(e.x.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;
                    }

                }

我建议使用非最优但易于编写的解决方案

创建
NSMutableDictionary
,其中包含数字作为键,出现次数作为值

可以使用由已知符号分隔的字符串中的if数字

在字典中循环检查
valueForKey
,如果需要,增加值


最后一步是分析我们的字典,对数字做任何你需要的事情。使用C。取小数部分。转换为具有已知精度的字符串。若字符串的长度表示缺少最后的数字,那个么它不会重复。使用NSString-UTF8String转换字符串。去掉最后一个数字(可能是舍入或实际的浮点算术错误)。使用函数int strncmp(const char*str1,const char*str2,size\u t num)在字符串本身内执行比较。如果结果为8个字符长,且最后2个字符与前2个字符匹配,那么前6个字符是否应视为重复

假设你的愿望是:

•可能性1:使用分数。输入分数。用分数计算。输出分数。扩展C++的分数类的许多例子中的一个,如果需要的话,使用它。
•可能性2:选择一个远低于两倍的精度。从结果中提取分数。减少分数,允许根据准确度进行舍入。

如何将数字/出现次数输入字典?这是我真正的问题。如果我有办法获得字符串中任意字符的计数,我可以处理出现计数。请提供真实输入示例啊哈!所以我知道重复的将被一个周期隔开。那就行了!但是,我如何检查发生的情况?这仍然是一个问题。我更新了问题以添加上下文。确定已知数字重复不会将数字确定为“重复”。如何将“2.333 E+06”缩短为“2.333333”?这个过程是不明确的。那么,您是否希望检查字符串中的任何位置是否有重复的数字(这就是您的问题标题所建议的)?例如,22222.3和2.33333?@user2311023在第一条评论中就是这样做的。从NSNumber到NSString的传输将它(至少对我来说)缩短到2.33333。我认为这只是将价值投射到另一个对象的一部分。第二条评论:不,对不起,只是小数点。将进行编辑以使其更清晰。您不完全理解“重复数”的数学概念。仅仅因为一个数字以“6767”结尾并不意味着它在数学意义上是“重复的”。它可能是,或者下一个数字可能是4。没有办法检查小数并判断它是否“重复”——要确定它是否“重复”,必须检查生成数字的算法。你不明白。仅仅发现小数点的已知数字重复并不能说明什么。33333/10000 = 3.3333. 但这不是数学意义上的“重复”数字,因为下一个数字是0。10/3也等于3.3333,精度相同,但下一个数字(以及后面的每一个数字)也将是3。但是,作为一个字符串,您无法区分“3.3333”和“3.3333”。
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    
}