Stringのextensionにcomputed propertyをつくる
before :
extension String { func numeralsToNumber() -> String { enum Chartype { case numerical case exp case normal init(_ number : Int) { switch number { case 0,1: self = .numerical // case 1: // self = .exp default: self = .normal } } } let japaneseNumericalChars : [String : String] = [ "〇": "0", "一": "1", "二": "2", "三": "3", "四": "4", "五": "5", "六": "6", "七": "7", "八": "8", "九": "9", ] let japaneseChars : Set = Set(japaneseNumericalChars.keys) let japaneseNumericalExpChars : [String : String] = [ "十": "1", "百": "2", "千": "3", "万": "4", "億": "8", ] let japaneseExpChars : Set = Set(japaneseNumericalExpChars.keys) var splitedStr : [String] = [] // 以下略
after :
extension String { var japaneseNumericalChars : [String : String] { return [ "〇": "0", "一": "1", "二": "2", "三": "3", "四": "4", "五": "5", "六": "6", "七": "7", "八": "8", "九": "9", ] } var japaneseChars : CharacterSet { return CharacterSet(charactersIn: japaneseNumericalChars.keys.joined()) } private func convertCharToStr1To9(_ char : Character) -> String { return japaneseNumericalChars[char.description]! } var japaneseNumericalExpChars : [String : String] { return [ "十": "1", "百": "2", "千": "3", "万": "4", "億": "8", ] } var japaneseExpChars : CharacterSet { return CharacterSet(charactersIn: japaneseNumericalExpChars.keys.joined()) } private func convertExpStrToNumStr(_ str : String) -> String { return japaneseNumericalChars[str]! } enum Chartype { case numerical case exp case normal init(_ number : Int) { switch number { case 0,1: self = .numerical default: self = .normal } } } func numeralsToNumber() -> String { var splitedStr : [String] = [] // 以下略
computed propertyはletでできないとかdictionaryプロパティに直接アクセスできないから専用のメソッドを作ったりしないといけないとか色々あったけど大きな問題はなく実装できた。
10の乗数混じりの漢数字をアラビア数字に変換する
// 10の乗数混じりの漢数字を変換する func convertNumerialStringToNumberWithString(_ string : String) -> String { let japaneseNumericalExpChars : [String : String] = [ "十": "1", "百": "2", "千": "3", "万": "4", "億": "8", ] let japaneseExpChars : Set = Set(japaneseNumericalExpChars.keys) let convStr : String = string.characters.reversed().reduce("", { if $0.0.isEmpty { if japaneseExpChars.contains($0.1.description) { return expStr(japaneseNumericalExpChars[$0.1.description]!, isOnlyZero: false) } else { return convertCharToStr1To9($0.1) } } if japaneseExpChars.contains($0.1.description) { return String(Int($0.0)! + Int(expStr(japaneseNumericalExpChars[$0.1.description]!, isOnlyZero: false))!) } else { return convertCharToStr1To9($0.1) + $0.0.substring(from: $0.0.index(after: $0.0.startIndex)) } }) return convStr }
漢数字をアラビア数字に変換するstring型のextentionを作った
extension String { func numeralsToNumber() -> String { let japaneseNumericalChars : [String : String] = [ "〇": "0", "一": "1", "二": "2", "三": "3", "四": "4", "五": "5", "六": "6", "七": "7", "八": "8", "九": "9", ] let japaneseChars : Set = Set(japaneseNumericalChars.keys) let strArr : [String] = self.characters.map{ japaneseChars.contains($0.description) ? japaneseNumericalChars[$0.description]! : $0.description } return strArr.joined() } }
map内の文字を三項演算子で処理することろがグッとこないのであとで直したいような気がする。