我有这个小代码
NSMutableArray *myArray = [[NSMutableArray alloc] init];
NSNumber *myNumber = [NSNumber numberWithDouble:752.65];
[myArray addObject:myNumber];
Run Code Online (Sandbox Code Playgroud)
使用此代码,我将对象存储在数组中.但是现在我有两个彼此独立的对象.
如果我在将myNumber添加到数组后更改它,则数组内的值不会更改.我该如何存档?我试图只给出一个指向数组的指针,但它没有用.
我想在不使用numbreFromString:方法的情况下将NSString转换为NSNumber?numbreFromString:metgod在4.0中表现得很奇怪.所以我想使用替代方法将NSString转换为NSNumber.请帮我....
+ (NSString *)formatText:(NSString *) text withLocalSettings:(BOOL) isLacale {
NSNumber *aNsNumber= [numberFormatter numberFromString: text];
NSString *returnString = [NSString stringWithString:[numberFormatter stringForObjectValue:aNsNumber]];
if(isLacale) {
return returnString;
}
else {
return [NSString stringWithFormat:@"%lf",[aNsNumber doubleValue]];
}
}
Run Code Online (Sandbox Code Playgroud)
0
我正在开发一个应用程序,我需要在3.0和4.0中运行我的应用程序.我有一个文本字段,当我尝试在文本字段中输入数字时,行为就像这样...在3.0中: - 它允许输入7位数和2个小数值(我已经格式化了这样).我根据所选国家/地区对数字以及逗号分隔进行了格式化和本地化.它在3.0和3.1.2中完美运行
IN 4.0: - 它允许您只输入4个数字,输入第5个数字后,它将使文本字段为空.当您输入第5个数字时没有显示任何内容,当您输入第6个数字时,它从第1个数字开始并继续同样直到4个数字.例如: - 当你输入1234时,显示文本字段 - 1234,当你输入12345时,文本字段显示为"".当你现在输入6时,它以6开始,依旧等等.
我正在使用NSNumberFormatter和numberfromstring方法格式化在文本字段中输入的值.
我无法理解为什么会这样发生......请帮助我......
所以我玩的是arg的类类型在运行时未知的东西.像这样:
- (NSNumber *)doWhatever:(id)arg
{
// this ALWAYS FAILS
if ([arg isKindOfClass:[NSNumber class]]) {
return arg;
}
else {
// what was it???
NSLog("arg klass=%@", [arg class]); // prints NSCFNumber
}
// This check works correctly.
if ([arg isKindOfClass:[NSArray class]]) {
for (id x in arg) {
NSNumber *result = [self doWhatever:x];
if (result) {
return result;
}
}
}
return nil;
}
- (void)someMethod
{
NSArray *myArray = [NSArray arrayFromObjects:[NSNumber numberWithInt:3], nil]];
NSNumber *myNum = [self doWhatever:myArray];
NSLog(@"myNum=%@", myNum); …Run Code Online (Sandbox Code Playgroud) types objective-c objective-c-runtime dynamic-typing nsnumber
我试图将包含值0.305的NSNumber格式化为"30.5%".
但是,我的以下代码不起作用:
[numberFormatter setNumberStyle:NSNumberFormatterPercentStyle];
[numberFormatter setLocale:[NSLocale currentLocale]];
Run Code Online (Sandbox Code Playgroud)
如何指定该数字应格式化为具有一个小数位的百分比?
检查a NSNumber是否为分数的最佳方法是什么?
NumberIsFraction(@(0)); // NO;
NumberIsFraction(@(0.5)); // YES;
NumberIsFraction(@(1.0)); // NO;
Run Code Online (Sandbox Code Playgroud)
边境案件处理和绩效方面的"最佳".
我从a得到一个值TextField,我需要检查它中是否有数字.无论是浮点数还是整数都不重要,但绝对是"数字"
我怎么能抓住这个?
这就是我到目前为止所做的事情 - 即使obj是123(实际上是一个数字),条件是假的,所以我无法进入if.我已经尝试过NSValue和Data,但具有相同的结果.
id obj = self.textArea.text;
if ([obj isKindOfClass:[NSNumber class]]) {
self.weight = [NSNumber numberWithFloat:([self.textArea.text floatValue])];
Run Code Online (Sandbox Code Playgroud) 创建 时SKStoreProductViewController,我传递一个带有商店标识符参数的字典。:
@{ SKStoreProductParameterITunesItemIdentifier : @010101010 };
Run Code Online (Sandbox Code Playgroud)
该值应该是NSNumber(如上所示):
与此键关联的值是 NSNumber 的实例,代表您希望商店在呈现视图控制器时显示的项目的 iTunes 标识符。
但当我将值作为字符串传递时,它可以毫无怨言地工作:
@{ SKStoreProductParameterITunesItemIdentifier : @"010101010" };
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?是否NSNumber根据给定的字符串自动创建正确的数字类型?这是发生在StoreKit 中NSNumber还是 StoreKit 正在这样做?
创建一个ARC新项目并在didFinishLaunchingWithOptions中注入此代码.
for (int i=0; i < 1000000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
Run Code Online (Sandbox Code Playgroud)
应用程序的内存将增加.此外,在for循环结束时,内存不会减少.
但是,如果你替换相同的for循环:
NSNumber* num = [NSNumber numberWithInt:i];
Run Code Online (Sandbox Code Playgroud)
通过
NSNumber* num = [[NSNumber alloc] initWithInt:i];
Run Code Online (Sandbox Code Playgroud)
然后记忆将保持稳定.
这是预期的行为吗?
编辑:
好吧,让我们暂时把didFinishLaunchingWithOptions放在一边.您仍然可以放入viewDidLoad并删除零以便更快地到达for循环结束应用程序的内存将增长到~11 MB.当for循环结束时,内存不会减少.它仍然是~11 MB.
- (void)viewDidLoad {
[super viewDidLoad];
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
}
Run Code Online (Sandbox Code Playgroud)
如果你去:
- (void)viewDidLoad {
[super viewDidLoad];
@autoreleasepool {
for (int i=0; i < 100000; i++) {
NSNumber* num = …Run Code Online (Sandbox Code Playgroud) 以下方法从UITextField获取输入并将其格式化以供显示.这段代码多年来一直运行良好,但是使用iOS 8.1在iPhone 6 Plus上报告了一个问题.它每次都发生在用户身上,但我无法重现它.我相信它与iOS 8上的NSNumber/NSDecimalNumber转换和格式有关,可能对于64位应用程序/设备.
用于输入的键盘是数字键盘,因此可输入文本字段的唯一文本是数字0-9和"删除".
根据用户的说法,这就是发生的事情:
我想输入250美元的预算金额.当我把它拉起来时,最初是显示0.00.然后,一旦我输入2,它然后显示220.02然后当我输入5它说2,200.25然后当我输入0时它会出现22,002.50如果我试图删除任何数字它出现了一个非常大的数字.
根据我的测试,下面的代码在iOS 8.1中与模拟器中的每个设备(包括iPhone 6 Plus)完美配合.它也适用于iOS 8.1的iPhone 5S设备(64位).我没有iPhone 6 Plus设备.
我错过了某人看到可能导致此错误的内容吗?
编辑:这可能是因为decimalNumberWithMantissa参数应该是unsigned long long我使用NSInteger?这会导致问题,如果是这样,为什么它会在iPhone 6 Plus上的iOS 8.1之前有效?如果可以的话,我会亲自检查一下......
entryField UITextField初始化如下:
entryField.text = [NSString stringWithFormat:@"%@", [[[ObjectsHelper sharedManager] currencyFullFormatter] stringFromNumber:[NSDecimalNumber zero]]];
Run Code Online (Sandbox Code Playgroud)
这是相关代码的其余部分:
#define MAX__NUMBER_LENGTH 10
- (BOOL)textField:(UITextField *)textFieldHere shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
__ENTERING_METHOD__
NSMutableString *mstring = [[NSMutableString alloc] initWithString:[entryField text]];
if([string length] > 0){
//add case
[mstring insertString:string atIndex:range.location];
}
else {
//delete case - the length of replacement string is zero for a delete
[mstring deleteCharactersInRange:range]; …Run Code Online (Sandbox Code Playgroud) 众所周知,CGFloat(在CoreGraphics,UIKit等中无处不在)可以是32位或64位浮点数,具体取决于处理器架构.
在C中,CGFloat它是一个typealias到float或double,在Swift则它被定义为struct CGFloat具有native属性(其是Float或Double).
已经多次观察到NSNumber可以从被创建并转换为Float和Double,但有从与存在不相似的转换CGFloat.一般建议(例如在Swift中将CGFloat转换为NSNumber)是通过转换Double
CGFloat <--> Double <--> NSNumber
Run Code Online (Sandbox Code Playgroud)
例:
let c1 = CGFloat(12.3)
let num = NSNumber(double: Double(c1))
let c2 = CGFloat(num.doubleValue)
Run Code Online (Sandbox Code Playgroud)
这很简单,也没有精确度.此外,大多数平台现在都是64位,然后CGFloat/Double
转换很简单,可能由编译器优化.
然而,这引起了我的好奇心,如果转换可以做到
无需促进CGFloat到Double32位平台.
可以使用构建配置语句(例如,应该使用条件编译来处理不同体系结构中CGFloat的差异吗?):
extension NSNumber {
convenience init(cgFloatValue value : CGFloat) {
#if arch(x86_64) || arch(arm64) …Run Code Online (Sandbox Code Playgroud)