2012-09-06 39 views
3

檢查NSDecimalNumber的實例是否是整數的最簡單方法是什麼?檢查NSDecimalNumber是否爲整數

謝謝!

+3

什麼具有u試過? – IronManGill

+3

我不確定。那麼'if([myDecNumber isEqualToNumber:[myDecNumber integerValue]]''? –

+0

只需將您的十進制值轉換爲int並檢查其是否相同 – muffe

回答

9
@interface NSDecimalNumber (IsIntegerNumber) 
@property (readonly) BOOL isIntegerNumber; 
@end 

@implementation NSDecimalNumber (IsIntegerNumber) 
-(BOOL)isIntegerNumber { 
    NSDecimalValue value = [self decimalValue]; 
    if (NSDecimalIsNotANumber(&value)) return NO; 
    NSDecimal rounded; 
    NSDecimalRound(&rounded, &value, 0, NSRoundPlain); 
    return NSDecimalCompare(&rounded, &value) == NSOrderedSame; 
} 
@end 
+1

Swift版本在這裏:https://stackoverflow.com/a/46331176/1187415。 –

-3

試試這個,你可以跳過第一行,我只是用它來創建一個NSDecimalNumber對象

NSDecimalNumber *decNumb=[NSDecimalNumber decimalNumberWithString:@"20.5"];//try with just 20 
NSString* str=[NSString stringWithFormat:@"%@",decNumb]; 

if ([str rangeOfString:@"."].location==NSNotFound && [str rangeOfString:@"-"].location==NSNotFound) { 
    NSLog(@"it is whole number"); 
} 
else 
    NSLog(@"it is not whole number"); 
+0

你能否給出downvote的理由? – Neo

+0

本地化不太好。而如果數字是「2.0」呢? – Sulthan

+0

NSDecimalNumber會自動將20.0轉換爲20.請檢查一下您的自我 – Neo

3

從十進制數減去整數。如果差值爲零,那麼十進制數是一個整數。

// testVal is NSDecimalNumber 
NSString *test = [testVal stringValue]; 
int intVal = [test intValue]; 
double doubleVal = [test doubleValue]; 
if(doubleVal-intVal == 0){ 
    NSLog(@"Whole number!"); 
} 

或者,得到的整數,並比較原始值:

if(intVal == doubleVal){ 
    NSLog(@"Whole number!"); 
} 
+0

我提交了答案的編輯,並將「double」更改爲「int」。不過,我認爲原始版本也可以正常工作。抱歉打擾你。 –

+0

是的,會的。沒關係。 – yoninja

+0

任何使用'double'的方法都不能與'NSDecimalNumber'一起使用。如果該號碼有30位數字會怎麼樣? – Sulthan

0

你能不能用IF((%1)== 0)

0
@implementation NSDecimalNumber (isWholeNumber) 
-(BOOL)isWholeNumber 
{ 
    double x = [self doubleValue]; //The approximate value of the receiver as a double. 
    double y = floor (x); 
    if(fabs(x - y) < DBL_EPSILON) 
     return YES; 
    return NO; 
} 
@end 
// [myDecNumber isWholeNumber]; 
+0

你失去了精確度。 'double'不能涵蓋來自'NSDecimalNumber'的所有值。 – Sulthan

+0

當我將'NSDecimalNumber'轉換爲'double'或'float'的時候,我感覺有一點精確度會丟失。我可能會誤解這一點,但我很想知道如果確實如此,這種方法的結果會受到影響。謝謝。 – James

+0

@Sulthan是的,因爲double是base-2,而NSDecimalNumber是base-10。 –

3

這應該管用。

當心使用將NSDecimalNumber轉換爲double的方法。

NSDecimalNumber* input = [...]; 

NSDecimal roundedDecimal; 
NSDecimalRound(&roundedDecimal, [input decimalValue], 0, NSRoundPlain); 

NSDecimalNumber* roundedNumber = [NSDecimalNumber decimalNumberWithDecimal:roundedDecimal]; 

BOOL inputIsWholeNumber = [input isEqualToNumber:roundedNumber]; 

您還應該檢查NaN的值。

+0

我還沒有機會測試它,但這似乎是我正在尋找的解決方案。謝謝。 – James

+0

@James也查看Jody Hagins的回答。 – Sulthan

+0

他/她在接受你的申請後立即提交。我提高了兩者,但我認爲改變他/她的接受答案可能會對尋求快速答案的其他人更有幫助。希望你不介意。 – James

0

不知道爲什麼,但由於某種原因,我無法獲得喬迪Hagins'或Sulthan的解決方案來工作,所以我去了一個稍微不同的方式:

-(BOOL)isWholeNumber:(NSDecimalNumber *)number { 
    NSDecimalNumber *input = number; 

    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain 
                          scale:0 
                        raiseOnExactness:NO 
                        raiseOnOverflow:NO 
                        raiseOnUnderflow:NO 
                       raiseOnDivideByZero:NO]; 

    NSDecimalNumber *vOne = [NSDecimalNumber decimalNumberWithString:@"1"]; 

    NSDecimalNumber *result = [number decimalNumberByMultiplyingBy:vOne 
                 withBehavior:handler]; 

    BOOL inputIsWholeNumber = [input isEqualToNumber:result]; 

    return inputIsWholeNumber; 
}