Swift 4で全角英数字のみを半角にする

NSMutableString とか NSRegularExpression とかが平気な人はもっと他に良いサンプルがググれると思うので参考になりません。全角→半角も単純に変換するだけなら String.applyingTransform のみでできるかと思います。

let s = "ABCD0123"
print("Debug: \(s.applyingTransform(.fullwidthToHalfwidth, reverse: false))")

やりたかったことは、全角カナとか「は」変換せずに英数字(+α)だけ変換したかった感じです。上記の方法だと全角カナも半角カナになってしまいます。ただ、以下のようなことをしなくても簡単な方法やサンプルはある気がしないでもない。

extension String {
    public func convertFromFullToHalf() -> String {
        let pattern = "[A-Za-z0-9() ]+"  // 全角の英数字と全角括弧と全角スペース。[ ]と - と + は半角です。
        var string = self
        for _ in 0...self.count {
            if let foundRange = string.range(of: pattern, options: .regularExpression, range: string.range(of: string), locale: .current) {
                if let replacing = string[foundRange.lowerBound..<foundRange.upperBound].applyingTransform(.fullwidthToHalfwidth, reverse: false) {
                    string = string.replacingOccurrences(of: pattern, with: replacing, options: .regularExpression, range: foundRange)
                }
            } else {
                break
            }
        }
        return string
    }
}

正規表現で指定した pattern に該当する全角文字が連続している場合はまとめて変換します。とは言っても applyingTransform で変換できない文字を pattern に指定しても無視されます。
念のため文字数分ループ回していますが該当する全角文字が存在しなければ(正規表現でマッチしなければ)そこでループを抜けています。Swift 4 からどうも substring が deprecated のようで Warning がでます。まだ使えはするようですが。

参考サイト:

Swiftで文字列から不要な文字を指定して削除したり、必要な文字だけを抽出する方法

Swift 4 で substring 的にインデックスを指定して部分文字列を取り出す方法

Mac 初心者なので、全角英数字をキーボードから入力する方法がわからなかった・・・。

「かな」入力の状態で希望の英字を入力(変換を行える状態)して  +  で変換できる模様。

フォローする