0

我正在制作一个 iphone 计算器应用程序,但遇到了这个问题,我似乎找不到解决方案。

当用户输入数字时,我将它们转换为双精度,然后将该双精度结果转换为字符串。我正在使用 %g 来获取整数。我遇到的问题是对于大量数字,它显示一个“E”指数。这是我迄今为止尝试过的

    NSLog(@"Num1: %g", 5000.0*8.0);
    NSLog(@"Num2: %g", 500000.0*85.0);
    NSLog(@"Num3: %f", 500000.0*85.0);
    NSLog(@"Num4: %.4f", 5000.0*8.0);
    NSLog(@"Num5: %.4f", 500000.0*85.0);
    NSLog(@"Num6: %g", 5000000.0/3.7);
    NSLog(@"Num7: %.4f", 5000000.0/3.7); 

这就是我得到的结果

    2013-10-20 14:09:34.261 ECalc[9947:a0b] Num1: 40000
2013-10-20 14:09:34.262 ECalc[9947:a0b] Num2: 4.25e+07
2013-10-20 14:09:34.263 ECalc[9947:a0b] Num3: 42500000.000000
2013-10-20 14:09:34.264 ECalc[9947:a0b] Num4: 40000.0000
2013-10-20 14:09:34.264 ECalc[9947:a0b] Num5: 42500000.0000
2013-10-20 14:09:34.265 ECalc[9947:a0b] Num6: 1.35135e+06
2013-10-20 14:09:34.266 ECalc[9947:a0b] Num7: 1351351.3514

就像普通计算器一样,当数字正常相乘时,我想显示整数。IE

Num2 = 42500000
Num7 = 1351351.3514

所以这是我的问题,是否有一个我可以使用的字符串格式说明符同时适合 num2 和 num7 结果?我是否需要使用大量逻辑来查看点后的数字是否为零然后截断它们,否则保留它们并使用 %.4f?

4

1 回答 1

1

因此,这是您需要的快速而肮脏的解决方案。

double num1 = 5000.0*8.0;
double num7 = 5000000.0/3.7;

int decimalPlaces = 4;

if ((int) num1 == num1)
    NSLog(@"Num1: %0.0f",num1);
else
    NSLog(@"Num1: %0.*f", decimalPlaces, num1);

if ((int) num7 == num7)
    NSLog(@"Num1: %0.0f",num7);
else
    NSLog(@"Num1: %0.*f", decimalPlaces, num7);

但是你似乎关心实际上是否能够拆分一个 NSString 。所以,第一块代码就是我推荐的方向。如果您选择让事情变得复杂并在整个计算器中保持在 NSString 中,那么您可以创建一个类,该类将拆分 NSString 并返回给您整数或带有所有小数的数字。我在这里提供的内容超出了您的需要,但是由于您是 iOS 新手,希望它可以帮助您学习,如果您愿意,您还可以做更多的事情。

-(NSString *)noZeroes:(NSString *)number
{
    int i = 0, decimalPos = 0;

    //NSRange says {startHere, forThisManyCharacters}
    NSRange subRange = {i, 1};
    NSString *substr = [number substringWithRange:subRange];

    while (i<[number length] && !([substr isEqualToString:@"."]))
    {
        i++;
        NSRange subRange = {i, 1};
        substr = [number substringWithRange:subRange];
    }

    //No decimal point in this number
    if (i == [number length])
        return number; //so return the number as is

    decimalPos = i+1;
    NSRange decimalRange = {decimalPos, [number length] - decimalPos};
    NSString *decimals = [number substringWithRange:decimalRange];

    NSRange wholeNumRange = {0, decimalPos};
    NSString *wholeNums =[number substringWithRange:wholeNumRange];

    //Numbers you don't want, you can put anything within a CharacterSet like this
    NSCharacterSet *notZeroes = [NSCharacterSet characterSetWithCharactersInString:@"123456789"];
    NSRange range = [decimals rangeOfCharacterFromSet:notZeroes];
    if (range.location == NSNotFound) {
        // nothing but zeroes in the string
        return wholeNums;

    } else {
        // nonzeroes are present
        return number;
    }
}

你可以这样称呼它:

NSString *Num1 = @"22345.56"
NSString *truncatedNum1 = [self noZeroes:Num1];
NSLog(@"Num1: %@", truncatedNum1);
于 2013-10-20T18:49:57.257 回答