質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

881閲覧

【Swift4】3桁区切りの実装について

aiskw

総合スコア16

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/08/24 06:36

前提・実現したいこと

下記ご回答をいただけますと幸いです。

計算機アプリを製作中です。テキストフィールド内に表示される文字列(数字)を3桁区切りにしたいです。

発生している問題・エラーメッセージ

下記コードの@IBAction func tap1Button(_ sender: Any)にてボタンを押下した際に、
「Unexpectedly found nil while unwrapping an Optional value」のエラーが発生し、
アプリがクラッシュします。
ネットで調べ3桁区切りができるようなコードを入れてみたのですが、テキストフィールドに表示される数字が4桁を超えるとクラッシュします。

1. 数字ボタンをタップ

2. テキストフィールドに数字が表示される

3. 4桁までは問題なく桁区切りされ表示される(1,111)

4. 5桁目を入力しようとすると上記エラーメッセージがでてクラッシュする
※該当箇所のエラースクリーンショットも添付しました

Outlet接続なども全て確認したのですが、特に問題はありませんでした。

func calcResult()@IBAction func tap1Button(_ sender: Any)部分のコードを変えたりしながらprintで確認してみたところ、

・5桁目を入力すると「nil」もしくは「0」になる
・5桁目以降入力はできるが「,」が付かない(1,1111111のように先頭から4桁目のところしか付かない)

となり、原因と対応方法ががわかりません。

基本的なところが理解できていないだと思いますが、どなたかご教示をお願いいたします。

イメージ説明

該当のソースコード

ViewController

1import UIKit 2 3class ViewController: UIViewController { 4 5 var resultValue: Int! 6 7 @IBOutlet weak var exchangeValueField: UITextField! 8 @IBOutlet weak var resultValueField: UITextField! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 exchangeValueField.text = "" 13 resultValueField.text = "" 14 15 exchangeValueField.attributedPlaceholder = NSAttributedString(string: "0", attributes: [NSAttributedString.Key.foregroundColor : UIColor.white]) 16 17 resultValueField.attributedPlaceholder = NSAttributedString(string: "0", attributes: [NSAttributedString.Key.foregroundColor : UIColor.black]) 18 } 19 20 func decimalStyle(moneyValue: String) -> String { 21 let formatter = NumberFormatter() 22 formatter.numberStyle = .decimal 23 formatter.groupingSeparator = "," 24 formatter.groupingSize = 3 25 formatter.maximumFractionDigits = 1 26 if let moneyValue = Double(moneyValue) { 27 return formatter.string(from: NSNumber(value: moneyValue)) ?? "(moneyValue)" 28 } 29 return moneyValue 30 } 31 32 func calcResult() { 33 let result = Double(resultValue) * 2.05 34 let formattedValue = decimalStyle(moneyValue: "(result)") 35 resultValueField.text = formattedValue 36 37 } 38 39 @IBAction func tap1Button(_ sender: Any) { 40 let inputValue = exchangeValueField.text! + "1" 41 let formattedInputValue = decimalStyle(moneyValue: "(inputValue)") 42 exchangeValueField.text = formattedInputValue 43 44 resultValue = Int(inputValue) 45 46 calcResult() 47 } 48}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんばんは。

載せていただいたコードを確認してみたところ、
StringからIntのキャストの部分でnilになりエラーが発生しているようでした。
以下の部分ですね。

Swift

1@IBAction func tap1Button(_ sender: Any) { 2 let inputValue = exchangeValueField.text! + "1" 3 let formattedInputValue = decimalStyle(moneyValue: "(inputValue)") 4 exchangeValueField.text = formattedInputValue 5 6 // ここでキャストが失敗 7 resultValue = Int(inputValue) 8 9 calcResult() 10 }

inputValue,(カンマ)が入っているためIntへのキャストが失敗し、
resultValuenilになってその後の処理で失敗するという流れだと思います。

どういう計算をしたいのかまでは汲み取ることができなかったので、
とりあえず,(カンマ)inputValueから削除するようにすればエラーは出なくなると思います。

Swift

1@IBAction func tap1Button(_ sender: Any) { 2 let inputValue = exchangeValueField.text! + "1" 3 let formattedInputValue = decimalStyle(moneyValue: "(inputValue)") 4 exchangeValueField.text = formattedInputValue 5 6 // ,を文字列から削除する 7 let replecedInputValue = inputValue.replacingOccurrences(of: ",", with: "") 8 resultValue = Int(replecedInputValue) 9 10 calcResult() 11 }

ただ、このままではIntの最大値を超えてしまうとエラーになるので
何らかの入力制限をもうけたほうがいいかもしれません。

投稿2019/08/24 14:48

hayabusabusash

総合スコア767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiskw

2019/08/25 01:10

hayabusabusash 様 こんにちは。 ご回答をいただきましてありがとうございます。 >inputValueに,(カンマ)が入っているためIntへのキャストが失敗し、 こちら大変参考になりました。これが原因だったのですね。 ご教示いただいた内容にて修正を行ったところ、無事に望んでいた動きになりました! 本アプリでは通貨計算を行いたく、 ・数字ボタンタップで「exchangeValueField」に入力中の値を3桁区切りで表示 ・「resultValueField」に入力中の値の途中の計算結果を3桁区切りで表示 という動きを実現したく考えていました。 ご教示いただいた内容にて上記理想通りに実装ができ、本当に嬉しく思っています。 この度はお忙しい中、誠にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問