0

iPhone 電卓アプリを作成していますが、解決策が見つからないように見えるこの問題に遭遇しました。

ユーザーが数値を入力すると、それらを double に変換し、その double の結果を文字列に変換します。%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

通常の電卓と同じように、数値が正常に乗算されたときに整数を表示したいと思います。すなわち

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 に答える