【问题标题】:Problems with NSNumberFormatterNSNumberFormatter 的问题
【发布时间】:2014-02-10 22:45:42
【问题描述】:

我正在开发一个使用双精度的计算器应用程序,然后当您按下等于时,操作是使用双精度完成的,然后切换到 NSNumberFormatter。我的问题是当用户想要在屏幕上的答案中添加(或 -、/、*)一个数字时。如果屏幕上的数字没有逗号,一切正常,如果屏幕上的数字有逗号,我会得到一个随机数而不是正确答案。有什么建议么?

这是我的等号按钮代码。我对每个操作都有相同的代码。请原谅我糟糕的命名

test.firstnumbers 也是一个字符串,用于存储用户在第二组数字中输入数学问题之前的数字

    double number = [test.firstNumbers doubleValue];

    double otherNumber = [self.label.text doubleValue];

    double answer = number + otherNumber;

    NSNumberFormatter *finalAnswer = [[NSNumberFormatter alloc]init];

    [finalAnswer setNumberStyle:NSNumberFormatterDecimalStyle];

    self.label.text = [finalAnswer stringFromNumber:[NSNumber numberWithDouble:answer]];

【问题讨论】:

    标签: ios iphone objective-c nsnumberformatter


    【解决方案1】:

    double otherNumber = [self.labelTwo.text doubleValue];

    您永远不想将显示结果的视图用作数据的存储。这违反了 MVC 范式,而且通常是一个糟糕的计划。您应该将显示中的数字存储在数据模型中(即使该“模型”与视图控制器中的实例变量一样简单)。除了其他好处之外,这还避免了将数字转换为文本然后再转换回数字的需要,因此完全避免了逗号问题。

    看一下问题的直接原因,您使用的是NSString的-doubleValue方法将字符串转换为数字,但使用数字格式化程序将数字转换为字符串。如您所见,两者并不完全互补。使用数字格式化程序进行两种转换,你会有更好的运气。但是,同样,您真的不应该使用视图来保存操作数。

    【讨论】:

    • 好的,感谢这对您有很大帮助! (我更新了代码,但我意识到我在labelTwo 的代码中有错字。虽然我不认为这实际上会改变答案)
    【解决方案2】:

    这不是随机的,它完全可以预测但错误,因为doubleValue 不解释逗号。

    当当前显示的字符串是22,222,223,你尝试添加2,你尝试使用doubleValue得到22,222,223的double值。但是doubleValue 不理解逗号,所以它会在到达第一个逗号时停止。因此,您得到的不是22222223,而是22。该代码将2 添加到它并获得24,这就是您所看到的。

    要读取和解析包含逗号的数字,您将再次使用NSNumberFormatter,这次使用numberForString 方法。但是,正如@Caleb 指出的那样,这是一个非常糟糕的设计。您应该将值存储在代码中某处的属性中,并在执行数学运算时使用它。不要从您的 UI 中读取数据,除非它是用户刚刚输入的内容。 切勿将数据写入 UI,然后再将其读回,除非用户可以通过某种方式更改该数据。

    【讨论】:

    • 谢谢,这很有帮助!
    【解决方案3】:

    我同意 Caleb 的观点,您可以更好地将模型(数字计算)与其他视图+控制器分开。

    但是我认为问题在于从字符串转换为“双值”:用点替换所有逗号可能是诀窍。

    【讨论】:

    • 动画显示“22,222,223”。如果用点替换逗号,则会得到“22.222.223”。这也好不到哪里去。
    • 你是对的。我这样解释是因为意大利数字符号不使用其他逗号表示千位。因此,您必须删除除小数点以外的其他逗号并将其替换为点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多