我意识到NSDecimalNumber继承自NSNumber.
但是,我正在努力弄清楚如何从NSNumber初始化NSDecimalNumber或如何将NSNumber转换为NSDecimalNumber.
我试过了
NSDecimalNumber* d = [aNumber copy];
Run Code Online (Sandbox Code Playgroud)
aNumberNSNumber对象在哪里无济于事.
我错过了什么吗?
谢谢.
我尝试使用以下代码将Decimal转换为Int:
Int(pow(Decimal(size), 2) - 1)
Run Code Online (Sandbox Code Playgroud)
但我得到:
.swift:254:43: Cannot invoke initializer for type 'Int' with an argument list of type '(Decimal)'
Run Code Online (Sandbox Code Playgroud)
在这里我知道pow正在返回a Decimal但似乎Int没有构造函数和成员函数可以转换Decimal为Int.
如何在Swift 3中将Decimal转换为Int?
好吧,这可能是当天的愚蠢问题,但假设我有一个班级:
NSDecimalNumber *numOne = [NSDecimalNumber numberWithFloat:1.0];
NSDecimalNumber *numTwo = [NSDecimalNumber numberWithFloat:2.0];
NSDecimalNumber *numThree = [NSDecimalNumber numberWithFloat:3.0];
Run Code Online (Sandbox Code Playgroud)
为什么我不能有一个添加这些数字的函数:
- (NSDecimalNumber *)addThem {
return (self.numOne + self.numTwo + self.numThree);
}
Run Code Online (Sandbox Code Playgroud)
我为一个白痴提前道歉,谢谢!
我正在从一个看起来像这样的对象中检索一个键:
po obj
{
TypeID = 3;
TypeName = Asset;
}
Run Code Online (Sandbox Code Playgroud)
正在检索键值,如下所示:
NSString *typeId = (NSString*)[obj objectForKey:@"TypeID"];
Run Code Online (Sandbox Code Playgroud)
它不是typeId是NSString,而是NSDecimalNumber.这是为什么?
如何将其转换为NSString?
例如,对于原始,我会这样做
if ( (x >= 6000) && (x <= 20000) )
// do something here
Run Code Online (Sandbox Code Playgroud)
并且使用NSDecimalNumber,这就是我所拥有的
if ( (([x compare:[NSNumber numberWithInt:6000]] == NSOrderedSame) ||
([x compare:[NSNumber numberWithInt:6000]] == NSOrderedDescending))
&& (([x compare:[NSNumber numberWithInt:20000]] == NSOrderedSame) ||
([x compare:[NSNumber numberWithInt:6000]] == NSOrderedAscending)) )
{
// do something here
}
Run Code Online (Sandbox Code Playgroud)
这种比较还有其他方法(更简单,更优雅)吗?如果我将值转换为原始,我使用什么原语?我不想使用CGFloat,float或double,因为我在这里处理货币.或者如果我将它们转换为上面提到的那些,有人可以验证/解释精度吗?
我找不到任何资源,我一直在尝试各种各样的东西,但没有任何作用.
根据Apple的文档,你可以像这样围绕NSDecimalNumber:
NSDecimalNumber.decimalNumberByRoundingAccordingToBehavior(<#behavior: NSDecimalNumberBehaviors?#>)
Run Code Online (Sandbox Code Playgroud)
它接受一个NSDecimalNumberBehavior,我不确定如何操作,因为它(1)不能启动到变量并且它的属性已更改,并且(2)根据文档的roundingMode()方法不接受任何参数,但Xcode填写"自我"的参数空间.
我完全迷失了.回到基本问题; 如何在swift中舍入NSDecimalNumber?
提前致谢
我正在寻找一种NSDecimalNumber通过乘以负转的方法-1.
/* decNumber is the one I would like to turn negative */
NSDecimalNumber *decNumber = [values objectAtIndex:billIndex];
NSDecimalNumber *minusOne = [[NSDecimalNumber alloc] initWithInt: -1];
finalValue = [[NSDecimalNumber alloc] initWithDecimal: [[decNumber decimalNumberByMultiplyingBy: minusOne] decimalValue]];
Run Code Online (Sandbox Code Playgroud)
这有效,但感觉就像这么简单的逻辑太多了.你能想到更好的方法吗?
根据文档,[NSDecimalNumber decimalNumberWithString:]应使用locale小数分隔符:
NSDecimalSeparator是句点(例如,在美国使用)还是逗号(例如在法国使用)取决于默认语言环境.
但是当我尝试它时,这段代码:
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]);
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]);
Run Code Online (Sandbox Code Playgroud)
给...
100
100.1
Run Code Online (Sandbox Code Playgroud)
...作为iOS 5和iOS 6的输出.我尝试使用瑞典语和法语作为区域设置,因为这两个国家都使用逗号(,)作为小数分隔符.
输出应该不一样吗?
(我知道我可以使用[NSDecimalNumber decimalNumberWithString:locale:]来强制行为,所以这个问题不是关于找到替代方案,只是如果这是一个错误或我做错了什么)
好的团队,这很奇怪.[NSDecimalNumber integerValue]表现得很奇怪.
我坐在一个断点处,试图弄清楚为什么我的应用程序的某些部分在iOS8中被破坏了,而我正在查看一个名为"timeSeconds"的变量.在Xcode变量视图中看起来像这样:
_timeSeconds (NSDecimalNumber *) 344.514533996581994496
Run Code Online (Sandbox Code Playgroud)
但是当我在调试器中查询它时,我看到了这个:
(lldb) p [self.timeSeconds doubleValue]
(double) $14 = 344.51453399658192
(lldb) p [self.timeSeconds intValue]
(int) $15 = 344
(lldb) p [self.timeSeconds integerValue]
(NSInteger) $16 = -5
(lldb) p (NSInteger)[self.timeSeconds intValue]
(NSInteger) $17 = 344
Run Code Online (Sandbox Code Playgroud)
看到"-5"?在我提交雷达之前,你们中的任何人都可以复制或解释这些吗?
这是SSCCE:
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"344.514533996581994496"];
NSLog(@"%@", n); // 344.514533996581994496
NSLog(@"%ld", (long)[n intValue]); // 344
NSLog(@"%ld", (long)[n integerValue]); // -5
NSLog(@"%ld", (long)[n unsignedIntegerValue]); // 12
Run Code Online (Sandbox Code Playgroud)
提前致谢!
马修
我尝试将String转换为NSDecimalNumber,这是我的代码:
class func stringToDecimal (dataToDecimal: String) -> NSDecimalNumber {
let dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString(",", withString: ".")
print(dataToDecimal)
let decimalReturn = NSDecimalNumber(string: dataToDecimal)
print(decimalReturn)
if decimalReturn == NSDecimalNumber.notANumber(){
return 0.00
}
return decimalReturn
}
Run Code Online (Sandbox Code Playgroud)
首先,我认为可能是错误的,但即便如此.它不起作用.第一次打印(转换前)显示例如80,00,但打印(decimalReturn)仅显示80
if行只是检查结果是否不是数字.
nsdecimalnumber ×10
objective-c ×7
ios ×5
swift ×3
cocoa-touch ×2
iphone ×2
init ×1
ios8 ×1
nsnumber ×1
nsstring ×1
string ×1
swift3 ×1
xcode ×1