0

json フィードから価格を解析していますが、価格が等しい場合に別のボタンを表示したい0

だから私は次のようなものを得ました

NSString *const Small = [NSString stringWithFormat:  @"%i", [PriceFree intValue]];

注: PRICEFREE = 0 .

    if ([StoreParse objectForKey:@"price"]) {
    //display button to pay   

    } else if ([StoreParse objectForKey:@"price"] == Small) {

   //display button = free
    } else {
    }

ただし、「支払う」ボタンのみが表示され、価格が0

4

3 に答える 3

4

エラーは==、を使用して文字列参照を比較しているため、2つの変数が同じオブジェクトを参照しているかどうかを比較しており、同じ文字を含む文字列を参照しているかどうかは比較していません。後者を行うには、NSStringメソッドを使用しisEqualToStringます。

ただし、整数値を比較した方がよい場合があります。

まず、次の定義を変更しますSmall

int Small = [PriceFree intValue];

次に、比較を次のように変更します。

[[StoreParse objectForKey:@"price"] intValue] == Small)

これには、文字列に含まれる文字ではなく、文字列が表す数値に基づいて比較するという利点があります。たとえば、両方に値があるため、同等に比較されます。@"00"@"0"0

費用が0.99ドル(99セント)であるという補助的な質問の後のフォローアップ

価格が浮動小数点数としてドルとセントである場合は、次のいずれかを行います。

int(a) &intValueを以上に変更する必要がfloatあります。floatValue

(b)たとえば、int Small = (int)([PriceFree floatValue] * 100);を使用して値をセントに変換します。また

(c)10進数を使用します。

(a) float値が等しいかどうかをテストすることになるという欠点がありますが、決して良い考えではありません。(b)それを回避し、簡単です。(c)もそれを回避しますが、もう少し複雑です。実際の財務計算では、丸め誤差を回避するために浮動小数点を使用しません。

于 2012-05-08T00:05:23.277 に答える
2

行っている比較は、実際の文字列ではなく、ポインタ値に対するものです。次を使用してみてください。

} else if ([[StoreParse objectForKey:@"price"] isEqualToString:Small]) {

実際の文字列を比較します。

于 2012-05-07T23:52:38.367 に答える
0

あなたがしているのは、ニックネームの文字列型付けです (用語の強い型付けに関する言葉遊び)。文字列型付けとは、すべての型を文字列に変換し、文字列メソッドを使用してデータを比較または操作することです。

文字列オブジェクトはテキスト用であり、テキストのみです。数値を比較する場合は、数値型を使用していることを確認してください。

これStoreParseは辞書であり、アイテムの価格を表すキーまたはprice対応するキーを含んでいます。も文字列の場合は、キーの数値型を含むようにアプリケーションを修正する必要があります。NSNumberNSDecimalNumberpriceStoreParseprice

priceNSNumberorの場合、次のNSDecimalNumber方法で何かが無料かどうかを判断できます。

if ([[StoreParse objectForKey:@"price"] intValue] == 0)
{
    // price is 0
}

ヒント:

通貨を扱う場合は、NSDecimalNumber10 進数を正確に表現できる which を使用します。ほとんどの通貨は 10 進数であるため、これは便利です。floatやなどの 2 進浮動小数点型doubleは、すべての 10 進数を正確に表すことができないため、通貨を扱うときは、できるだけ正確に保つことが重要です。

于 2012-05-08T02:06:58.570 に答える