2014-02-10 30 views
1

我工作的計算器應用程序與雙打工作,然後當你按等於操作完成與雙打,然後切換到NSNumberFormatter。我的問題是當用戶想要在屏幕上添加(或 - ,/,*)一個數字到答案。如果屏幕上的號碼沒有逗號,一切正常,如果屏幕上的號碼有逗號,我會得到一個隨機數,而不是正確的答案。有什麼建議麼?問題與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]]; 

回答

2

雙otherNumber = [自我之前存儲的數字AA串。 labelTwo.text doubleValue];

您從不想使用顯示結果的視圖作爲數據存儲。這違反了MVC模式,而且通常只是一個糟糕的計劃。您應該在顯示器中存儲數字(即使該「模型」與視圖控制器中的實例變量一樣簡單)。除此之外,這可以避免將數字轉換爲文本然後返回數字,因此完全避免了您使用逗號時遇到的問題。

看看問題的直接原因,您正在使用NSString的-doubleValue方法將字符串轉換爲數字,但使用數字格式器將數字轉換爲字符串。正如你所看到的,這兩者並不完全互補。使用數字格式化程序進行這兩種轉換,你會有更好的運氣。但是,再一次,你真的不應該使用視圖來保存操作數。

+1

好的,謝謝這幫了很多! (我更新了代碼,但是我意識到我在代碼中使用'labelTwo'事件時出現了輸入錯誤。雖然我不認爲這實際上改變了答案) – user3186310

0

我同意迦勒,你可以更好地將模型(數字計算)分開到視圖+控制器的其餘部分。

但是我認爲問題是從字符串轉換成'雙值'轉換:用點替換所有逗號可能是訣竅。

+0

動畫顯示「22,222,223」。如果你用點代替逗號,你會得到「22.222.223」。這沒有比這更好。 –

+0

你說得對。我用這種方式解釋它,因爲意大利數字符號不會使用其他逗號數千。所以你必須除去小數點以外的其他逗號,並用點替換它。 –

1

這不是隨機的,它是完全可預測的但錯誤的,因爲doubleValue不解釋逗號。

當顯示當前字符串是22,222,223並嘗試添加2,試圖通過使用doubleValue得到的22,222,223的雙重價值。但doubleValue不理解逗號,所以它在到達第一個時停止。因此,而不是22222223,您會得到22的值。該代碼將2添加到它並得到24,這就是你所看到的。

要讀取和解析包含逗號的數字,您可以再次使用NSNumberFormatter,這次使用numberForString方法。但是,正如@Caleb指出的那樣,這是一個非常糟糕的設計。您應該將值存儲在代碼中的某個屬性中,並在執行數學時使用該屬性。除非是用戶剛輸入的內容,否則不要從用戶界面讀取數據。 永不將數據寫入用戶界面,然後將其讀回,除非用戶有某種方式更改該數據。

+0

謝謝,這有助於一噸! – user3186310