🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

4回答

608閲覧

引数に整数と小数を両方受け付けて整形

tkshp

総合スコア174

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/12/07 09:42

前提・実現したいこと

引数にint値文字列とfloat値文字列どちらも受け付けて、
int値文字列は、int値に変換して、float値文字列はfloatに変換するにはどのようにすればよいのでしょうか?
やりたいこととしては、

"1000" → 1,000 "1000.1" → 1,000.1

と変換するようなメソッドを作成したいです。

試したこと

Rails

1puts "1000".to_i #1000 2puts "1000".to_f #1000.0 3puts "1000.0".to_f #1000.0 4puts "1000.0".to_i #1000 5 6 7def numFormat(num) 8 # num.to_i.to_s(:delimited) 9end

int値をto_fしてしまうと、余計な「.0」が付与されてしまい、
逆にfloat値をto_iしてしまうと、小数が消えてしまうので、
引数の数値文字列が、int値かfloat値を判定して、
int値ならば、to_iして、float値ならば、to_fするという分岐をすれば、
目的のメソッドが作成できそうな気がするのですが、
どのようなコードを書けばよいでしょうか?
さらにもっと細かなことを考えれば、
引数に

int値 int値文字列 float値 float値文字列

の4種類を受け付けて、3桁区切りの文字列に整形したいと考えています。
ご教示お願いします。

補足情報(FW/ツールのバージョンなど)

Rails 5.2.3

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

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

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

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

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

guest

回答4

0

参考情報

  • 整数に3桁区切りカンマを仕込む備忘録

https://qiita.com/katsumata_ryo/items/1055c2f27cbd99e67fc2

これを参考に作ってみました。
num.rb

ruby

1d![イメージ説明](ce3ed11d6c0c698dcac91220a68fa481.png)Format(num) 2 num.to_s.gsub(/(\d)(?=(\d{3})+(?!\d))/, '\1,') 3end 4 5data = [ 6 1000, 1000.123, "2000", "2000.123", 7 -1000, -1000.123, "-2000", "-2000.123", 8] 9 10data.each do |x| 11 puts("#{x.inspect} -> #{numFormat(x)}") 12end

実行例:
イメージ説明

投稿2019/12/08 01:13

katoy

総合スコア22324

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

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

tkshp

2019/12/09 01:52

ご回答ありがとうございます。 勉強になります。 ありがとうございます。
guest

0

ベストアンサー

case num when String ; when Float ; when Ineger ; end

では?

投稿2019/12/07 13:49

winterboum

総合スコア23567

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

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

tkshp

2019/12/07 15:20

ご回答ありがとうございます。 ご提示いただいた方法で型判定ができることが確認できました。 ありがとうございます。 また、調べたのですが、classで型判定もできるのですね。 puts "test".class == String #true 勉強になりました。 ありがとうございました。
guest

0

文字列に"."が含まれていたらfloat値文字列と判断して、.to_fする
文字列に"."が含まれていなかったらint値文字列と判断して、.to_iする

で良いのでは?

投稿2019/12/07 10:20

coco_bauer

総合スコア6915

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

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

tkshp

2019/12/07 10:45

ご回答ありがとうございます。 文字列の場合はその方法で解決すると思いますが、 def numFormat(num) # num.to_i.to_s(:delimited) end 引数にint値やfloat値を受け取る場合はどうしたらよいですか? ①int値やfloat値をto_sで文字列に変換。 ②"."が含まれていたらfloat値文字列と判断して、.to_fする  "."が含まれていなかったらint値文字列と判断して、.to_iする ③さらに、to_s(:delimited)する という方法しかないですか?
guest

0

int値をto_fして、後尾に.0がついてるとその2文字を削除すればいいんでは

投稿2019/12/07 09:43

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問