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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

4回答

808閲覧

Ruby FizzBuzz問題 文字列も数値で返ってくる

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/05/09 11:18

編集2021/05/09 11:22

前提・実現したいこと

FizzBuzzで、
a.3で割り切れる→Fizz
b.5で割り切れる→Buzz
c.3でも5でも割り切れる→FizzBuzz
d.それ以外の数値→数値をそのまま返す
e.数値以外の入力→エラーメッセージ

このようなプログラムを組みたいです。
入力できる数値に制限は設けないこととします。

発生している問題・エラーメッセージ

dまでは正しく返ってくるプログラムを組めました。
しかし、”e.数値以外の入力”がすべてFizzBuzzで返ってきてしまいます。
例)こんにちは→BuzzFizzで返ってきてしまう

該当のソースコード

puts "数字を入力してください" number = gets.to_i if number % 3 == 0 && number % 5 == 0 puts "FizzBuzz" elsif number % 5 == 0 puts "Buzz" elsif number % 3 == 0 puts "Fizz" elsif number puts number else puts "Error/Type number" end

試したこと

入力時にto_iを使用しているからだと推測はできるのですが、
このサイトの質問を遡ったり、自分なりに調べてもうまくいきませんでした。

ご教授お願いします。

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

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

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

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

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

guest

回答4

0

ruby

1def number?(str) 2 str =~ /\A\s*[+\-]?[0-9]+\s*\z/ 3end 4 5puts '数字を入力してください' 6str = gets 7 8message = '' 9if number?(str) 10 number = str.to_i 11 message += 'Fizz' if (number % 3).zero? 12 message += 'Buzz' if (number % 5).zero? 13 message += number.to_s if message.length.zero? 14else 15 message += 'Error/Type number' 16end 17 18puts(message)

0, 1, 2, 3, +1, -1, 1.2 や 前後に SPACE を入れた場合などを試してみてください。

投稿2021/05/09 22:56

katoy

総合スコア22324

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

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

0

数値の型をしていない文字列に対してはto_i0を返すので、getsをそのままto_iしては駄目です。
元が何だったか分からなくなってしまう。

Ruby

112正規表現で数字だけかチェックする。普通のやり方。 3number = gets 4if /\A[0-9]+\z/ =~ number 5 627to_i したものを to_s して、元と一致するか確認する。整数であっても一致しないことも。 8number = gets 9if number == number.to_i.to_s 10 11312Integer(整数でない場合は例外) と rescue を使う。あまり普通でない気がする。 13number = (Integer(gets) rescue nil) 14if number

投稿2021/05/09 11:59

otn

総合スコア84529

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

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

退会済みユーザー

退会済みユーザー

2021/05/09 14:03

一番具体的に回答していただいたので、もう少しお尋ねしたいです。 案1、案2は number = get.to_iの箇所と置き換えればよいということでしょうか?
otn

2021/05/09 15:56

コードの意味を理解した上で、適用してください。
guest

0

入力時にto_iを使用しているからだと推測はできるのですが、

そのとおりです。String#to_iは、数値としての解釈に失敗した場合、0を返します(るりま)。

投稿2021/05/09 11:26

maisumakun

総合スコア145183

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

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

0

入力時にto_iを使用しているからだと推測はできるのですが、

数値に変換できなければ0と返すのが仕様のようですね。

ruby

1puts "a".to_i 2puts "あいうえお".to_i 3puts "abc001".to_i 4puts "8792137".to_i

となれば、いきなりto_iするのではなく、正規表現などで「渡された文字列が全て数値かどうか」を先に判断しては?

投稿2021/05/09 11:26

m.ts10806

総合スコア80850

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

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

m.ts10806

2021/05/09 11:26

to_i だと小数点以下切り上げするようなので、to_iが本当にいいかどうかは要件次第
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問