#やりたいこと#
TextFieldに数字をキー入力するたびに、3桁ごとのカンマ区切りの数字として表示させる。
例:1234567と入力 → 1,234,567と表示、続けて8を入力すると12,345,678と表示
→キーイベント発生時にNSNumberFormatterでテキスト整形すればOK
参考:[Swift]数字を三桁ごとにカンマ区切りにする
と同時に、TextFieldの値を用いて数値計算を行う。
→整形した表示用テキストとは別に、数値をカンマ区切りでない状態で計算し、計算結果は別のTextFieldにカンマ区切り表示させる
#実装#
Storyboard上に3つのTextFieldを置いてtextField1,2,3としてアウトレット化、それぞれのEditingChanged発生時に共通のIBAction(任意のメソッド名editingChangedとしておく)の指定もした状態で
ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
@IBOutlet weak var textField3: UITextField!
//上2段のTextFieldのEditingChangedに下の関数を設定
@IBAction func editingChanged(sender: UITextField) {
sender.text = addComma(removeComma(sender.text!))
//計算してみる
calc()
}
let formatter = NSNumberFormatter()
override func viewDidLoad() {
super.viewDidLoad()
//キーボードを数値入力に固定
textField1.keyboardType = UIKeyboardType.DecimalPad
textField2.keyboardType = UIKeyboardType.DecimalPad
textField3.keyboardType = UIKeyboardType.DecimalPad
//3桁ごとにカンマ区切りするフォーマット
formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
formatter.groupingSeparator = ","
formatter.groupingSize = 3
}
//カンマ区切りに変換(表示用)
func addComma(str:String) -> String{
if(str != "") {
return formatter.stringFromNumber(Double(str)!)!
}else{
return ""
}
}
//カンマ区切りを削除(計算用)
func removeComma(str:String) -> String{
let tmp = str.stringByReplacingOccurrencesOfString(",", withString: "")
return tmp
}
//1,2段目の和を3段目に表示
func calc() {
//1,2段目が空でない(=数値)の時のみ計算する
if(textField1.text != "" && textField2.text != ""){
let sum = Double(removeComma(textField1.text!))! + Double(removeComma(textField2.text!))!
textField3.text = addComma(String(sum))
}
}
}
#注意#
- キー入力できる最大の桁数についてはここではサポートしていません。
- この実装だと小数点が入力できません。
- コピペ機能等を用いて数値以外を入力させないようにする対策についてもサポートしていません。
- XCodeシミュレーター上でMacのキーボードから数値入力すると
Can't find keyplane that supports type 8 for keyboard iPhone-Portrait-DecimalPad; using 2617181025_Portrait_iPhone-Simple-Pad_Default
というエラーログが表示されるが、シミュレーターメニューのHardware>Keyboardから、シミュレーター上キーボードで入力するようにすればエラーにはならないのでOK。参考リンク