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

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

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

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

Q&A

解決済

3回答

10296閲覧

Stringで保持している数値の不要な小数点以下の0を削除する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

1グッド

0クリップ

投稿2020/03/10 23:45

編集2020/03/11 01:47

いつもお世話になります。

Stringで保持している数値の小数点以下の不要となる0を取り除きたいのですが、良い方法ご存知でしたら教えて下さい。
現状、いったんDoubleにしてからStringに戻しているので面倒くさいので、String(format: )での0埋めの逆のような処理はないのかと思いまして。

swift

1func removeZero(_ str: String) -> String { 2 3 // 整数部分のの文字列にだけ処理をかけるので小数部分をもつものを持たないもので処理を分岐 4 5 if let d: String.Index = str.firstIndex(of: ".") { 6 // 小数部分が存在する場合の処理 7 8 let s: String.Index = str.startIndex 9 let e: String.Index = str.endIndex 10 11 // 整数部分を取り出す 12 13 let tmpIntStr: String = String(str[s ..< d]) 14 let intStr: String = String(Int(tmpIntStr) ?? 0) 15 16 // 整数部分に対して変換処理をする(略) 17 18 // 小数部分を取り出す 19 let deciDouble: Double = Double(String(str[d ..< e])) ?? 0.0 20 let tmpStr: String = String(String(deciDouble).dropFirst()) 21 let deciStr: String = tmpStr == ".0" ? "" : tmpStr 22 23 24 return intStr + deciStr 25 26 } else { 27 // 小数部分がない場合の処理 28 29 // 整数部分に対して変換処理をする(略) 30 return String(Int(str) ?? 0) 31 } 32} 33 34print(removeZero("12.34000")) //=> 12.34 35print(removeZero("-12.00")) // => -12 36print(removeZero("0.00")) // => 0 37print(removeZero("000.0000")) // => 0 38print(removeZero("0000")) // => 0 39 40
ofp857👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

正規表現わかんない。

swift

1 2extension String { 3 var strReplace: String { 4 guard let _ = try? NSRegularExpression(pattern: "^[\d].[\d]$", options: []) else { 5 return self 6 } 7 8 guard let str = try? NSRegularExpression(pattern: "0+$", options: []) else { 9 return self 10 } 11 12 var replacedStr: String = str.stringByReplacingMatches(in: self, 13 options: [], 14 range: NSMakeRange(0, self.count), 15 withTemplate: "") 16 17 if replacedStr.hasSuffix(".") { replacedStr.removeLast() } 18 19 return replacedStr 20 } 21} 22 23print("123.4500".strReplace) // => 123.45 24print("123.000".strReplace) // => 123 25print("123.0".strReplace) // => 123 26print("123".strReplace) // => 123 27

投稿2020/03/11 14:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

値型に変換すると末尾に余計な.0がついてしまうことがあるみたいですね。
こんな感じでいかがでしょうか。

swift

1func removeZero2(_ str: String) -> String? { 2 guard let d = Double(str) else { 3 return nil 4 } 5 6 var t = String(d) 7 8 if let range = t.range(of: ".0") { 9 t.replaceSubrange(range, with: "") 10 } 11 12 return t 13}

#別解

Swift

1extension String { 2 func suffixZeroSuppress() -> String? { 3 guard let d = Double(self) else { 4 return nil 5 } 6 7 var t = String(d) 8 9 if let range = t.range(of: ".0") { 10 t.replaceSubrange(range, with: "") 11 } 12 return t 13 } 14} 15 16print("12.34000".suffixZeroSuppress()!) //=> 12.34 17print("-12.00".suffixZeroSuppress()!) // => -12 18print("0.00".suffixZeroSuppress()!) // => 0 19print("000.0000".suffixZeroSuppress()!) // => 0 20print("0000".suffixZeroSuppress()!) // => 0

投稿2020/03/11 00:24

編集2020/03/11 02:12
TsukubaDepot

総合スコア5086

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

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

退会済みユーザー

退会済みユーザー

2020/03/11 01:47

回答ありがとうございます。 マイナス記号はコピペミスです。 Doubleにすると0 -> 0.0になるので、かならず余計な.0はついてしまいますね。 文字列操作系のメソッドでなんかいいのないですかね?
TsukubaDepot

2020/03/11 02:13

私が知らないだけだと思いますが、なさそうな感じですね。 いっそのことStringのextensionを書いてみるというのはいかがでしょうか。 私が申し上げるまでは無いと思いますが、追記してみました。
guest

0

一回数値型に変換してから
数値→文字列に変換すれば一発のような

投稿2020/03/11 00:00

yukiyuki123456

総合スコア130

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

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

退会済みユーザー

退会済みユーザー

2020/03/11 01:47

回答ありがとうございます、一発といえば一発ですが…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問