• ベストアンサー

Rubyでの比較 (Float)

Ruby初心者です。 簡単な比較を行いたいんですが、エラーが出てしまいます。 ファイルに ex. ruby_test.rb 0 12.3243 32 112.233 0.33123 とあり、このファイルを読み込んで比較しようとしています。 以下のコードで比較しようとしました。 ----------------------------------------------------------- fp = open("c:/ruby_test.txt") aaa = Array.new while line2 = fp.gets line2.chomp! bbb = line2.split(/\t/) aaa << bbb[1] if ( bbb[2] < 1.301029996 ) then       ※11行目 print "aaa\n" elsif ( bbb[2] < 8.164943898 ) then print "bbb\n" elsif ( bbb[2] >= 8.164943898 ) then print "ccc\n" end end fp.close -------------------------------------------- 実行すると ( ※ **** はファイル名 ) C:/ruby/*******.rb:11:in'<': comparison of String with Float failed (Argument Error) というエラーが出ます。 比較する  bbb[2] < 1.301029996  を bbb[2] < "1.301029996" すれば 動きますが、これでは文字列としての比較になってしまいますよね?? Floatは数字として比較するにはどうしたらよいのでしょうか? どなたか宜しくお願いします。

  • nika_
  • お礼率88% (24/27)

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>C:/ruby/*******.rb:11:in'<': comparison of String with Float failed (Argument Error) これで何を云わんとしているかというと、 ファイルから読み出してきた文字列を元に作られた文字列である bbb[2] と、数値である1.301029996 とを '<' を使って比較することができない ということです。 Perlのように、このようなときに文字列→数値とか数値→文字列の 自動的な変換をRubyはしませんので、スクリプトを書く人が自分で書いてやらなければいけません。 if ( bbb[2].to_f < 1.301029996 ) then  のようにすればよいかと。

nika_
質問者

お礼

ありがとうございます!! 出来ました! Perlメインでプログラムを書く事が多かったので、sakusaker7さんのおっしゃるとうり自動変換を無意識のうちに期待していたようです。 こんな基礎的な事で申し訳ありません。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

bbb[2] が String だから怒られてるんじゃない? bbb[2].to_f < 1.301029996 でもダメですか?

nika_
質問者

お礼

ありがとうございます!! 出来ました!! こんな基礎的な事で申し分けませんでした。

関連するQ&A

  • rubyがInternalServerError

    こんばんは。 自鯖にて初めてrubyを動かそうとしたところInternalServerError(500エラー)が帰ってきます。 まず、httpd.confに ---------------------- AddHandler cgi-script .cgi .rb ---------------------- と追加しました(このため.htaccessは作成しなくていいと思う)。 コマンドラインにて[which ruby][whereis ruby]を使い、[/usr/bin/ruby]にrubyがあることはわかるのですが、エラーが出てしまいます。 [test.rb] ---------------------- #!/usr/bin/ruby print "Content-type: text/html\n\n" print "test" ---------------------- 上記プログラムには755のパーミッションを与えています。 上記のフォルダにはCGI実行権が与えられています。 上記のフォルダではCGIはしっかりと動きます。 上記のプログラムはコマンドライン上[ruby test.rb]では動きます。 また、他のサイトもいろいろ調べましたが #!/usr/bin/env ruby #!ruby #!/usr/local/bin/ruby どのいパスでもエラーがでました。 解決方法を教えてください。 サーバ ---------------------- CentOS 5.4Final Apache 2.2.3 Ruby 1.8.5 ----------------------

  • rubyのプログラムについて

    rubyのプログラムで2~1000までの素数を列挙のものなんですがどこか違ってますか汗 考えたんですがよくわからなくて汗すみませんどなたかお願いします i=2 print "素数は\n" while i<=1000 do warukazu=2 flag=0 while warukazu<i do if i%warukazu==0 then flag=flag+1 warukazu=warukazu+1 else warukazu=warukazu+1 end end if (flag==0) then print i print"\n" end i=i+1 end

  • Ruby/DBIが上手く動きません。。

    http://code.nanigac.com/source/wiki/view/496 上記のサイトさんを参考にRubyからMySQLのデータベースにアクセスするプログラムを作りました。 コマンドプロンプト上では動作するのですが、同パソコンでブラウザから開くとエラーをはきます。 どなたか理由を教えていただけないでしょうか? 環境 WindowsXP Professional Apache 2.0.63 ruby 1.8.6 dbi-0.2.0 MySQL 5.0.51a [ソースコード] #!/user/local/bin/ruby print "Content-type: text/html\n\n" def error_cgi() print "*** CGI Error List ***<br />" print "#{CGI.escapeHTML($!.inspect)}<br />" $@.each {|x| print CGI.escapeHTML(x), "<br />"} end begin require "dbi" require "cgi" print <<EOF <html> <head> <title>データベース</title> </head> <body> EOF # MySQLサーバへ接続 dbh = DBI.connect("dbi:Mysql:test:localhost", "testuser", "testpass") # サーババージョンの文字列を取得して、表示する。 row = dbh.select_one("SELECT VERSION()") print "Server version: #{row[0]}\n" print <<EOF </body> </html> EOF rescue DBI::DatabaseError => e print "An error occurred" print "Error code: #{e.err}" print "Error message: #{e.errstr}" rescue error_cgi() ensure # サーバから切断 dbh.disconnect if dbh end [プロンプト] Content-type: text/html <html> <head> <title>データベース</title> </head> <body> Server version: 5.0.51a-community-nt </body> </html> [ブラウザでのエラー] *** CGI Error List *** #<DBI::InterfaceError: Could not load driver (no such file to load -- C:/user/local/lib/ruby/site_ruby/1.8/dbd/Mysql)> C:/user/local/lib/ruby/site_ruby/1.8/dbi.rb:368:in `load_driver' C:/user/local/lib/ruby/site_ruby/1.8/dbi.rb:233:in `_get_full_driver' C:/user/local/lib/ruby/site_ruby/1.8/dbi.rb:219:in `connect' D:/Development/NotePC WEB/public_html/cgi-bin/database.rb:24

  • rubyの日本語名関数

    rubyの環境を変えたところ日本語の関数名が使えなくなりました。 解決策があればお願いします。 [環境] OS:Windows VISTA ruby:1.8.7-p330-i386-mswin32 (外付けHDDに展開して利用) 実行方法:cmd.exe /k "ruby.exeのパス" "rbファイルのパス" で実行 [以前の環境] OS:WINDOWS XP ruby:ActiveScriptRuby(1.8.7-p330) (Cドライブにインストール) [ソース(外部rubyファイル元.rb)] # EUC-JP :-Ke # SHIFT-JIS :-Ks # UTF-8N :-Ku # SHIFT-JISコード設定にしました #! ruby -Ks def 元関数() print "元関数だよ!\n" end require '外部rubyファイル先' print "外部ファイルの関数を実行\n" 先関数() print "内部ファイルの関数を実行\n" 元関数() print "Enterキーを押してください\n>" a = gets.to_i [ソース(外部rubyファイル先)] def 先関数() print "先関数だよ!\n" end

    • ベストアンサー
    • Ruby
  • ファイル読み込み時の文字列比較が上手くいきません

    よろしくお願いします。 cgiの勉強中なのですが、文字列の比較が上手くいかずに困っています。 プログラム中に記述した日本語は問題なく同じ文字として比較されるのですが、 ファイルから文字を読み込んだ日本語を比較させようとすると上手くいきません。 以下のプログラムでは4箇所から「yes」と返ってくるのが理想でしたが、 後半の2箇所からしか「yes」と返ってきませんでした。 文字コードの問題かとも思い、NKF等で変換してみたり試してみましたが上手くいきませんでした。 また、どのファイルもUTF-8に統一されているのでファイルの読み込み時に文字コードの変換は必要無いのではないかとも思っています。 使用しているファイルは以下の3ファイルとなり、同一フォルダに入れています。 プログラム中で日本語を使用したかったので、どのファイルも文字コードはUTF-8で保存しています。 question.rb  :メインプログラム Unit_module.rb :メインから呼び出すモジュール question.txt  :文字列の入ったテキスト(最後は改行していません) rubyのバージョンは1.9.3p125を使用しています。 独学ですので周囲に訊く事も出来ずにいます。 何が問題で文字列の比較が上手くいっていないのでしょうか? 以下は各ファイルの内容となります。 ---------------question.rb----------------------------------------- #! /usr/local/bin/ruby # -*- encoding: utf-8 -*- #モジュール読み込み require "./Unit_module" include Unit #HTML作成 print "Content-Type:text/html;charset=utf-8\n\n" print <<EOF <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> EOF str_test = "" #ファイル読み込み時の日本語の比較 f = open("./question.txt", "r") f.each{|line| str_test = line if str_test == "東" then print "yes" end test(str_test) } #プログラム中に記述した日本語の比較 str_test = "東" if str_test == "東" then print "yes" end test(str_test) print "</body></html>" -----------Unit_module.rb------------------ # -*- encoding: utf-8 -*- module Unit def test(str_test) if str_test == "東" then print "yes" end end end -----------question.txt--------------------- 東 --------------------------------------------

    • ベストアンサー
    • Ruby
  • rubyのファイルを実行できません。

     Debian(Woody)の環境です。 #find ./ -name ruby ./usr/bin/ruby ./usr/share/doc/ruby ./usr/doc/ruby ./usr/lib/ruby があり、/usr/binにrubyのファイルが確認できます。 $ruby -v ruby 1.6.7 (2002-03-19) [i386-linux] が出ます。pathが通っています。 $ ruby -e 'print "hello World\n"' で hello World もちゃんどでます。 しかし、vi hello.rbで、中には ------------------- #!/usr/bin/ruby print "Hello World!\n" --------------------- と、実行権-rwxr-xr-xにします。 %hello.rb では: bash: hello.rb: command not found が出て,実行できませんでした。 ファイルの中に、#!/usr/lib/rubyに代えてもおなじでした。  因みに %env で ... PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11 ... がでます。  アドバイスをよろしくお願いします。

    • 締切済み
    • CGI
  • ハッシュを使った集計結果の出力について

    ハッシュを使った集計結果の出力について testフォルダに以下のファイルがあるとします。  aaa_1、aaa_2、bbb_1、bbb_2、ccc_1、・・・ 各ファイルには○△×がついた行があり、 「aaa」のファイル(aaa_1とaaa_2)の○△×の数、「bbb」のファイルの○△×の数、を集計したいと思っています。 出力イメージは以下です。  ファイル名の一部,○の数,△の数,×の数  aaa,13,59,37 ファイル名の一部をキーとして、 ○△×の回数を値にしたハッシュで集計しようとしましたが、 以下のようになってしまいました。 ,0,0,0 ,0,0,0,0,0,0 aaa,13,59,0 aaa,13,59,0,13,59,37 bbb,20,10,0 bbb,20,10,0,20,10,30 ハッシュが十分に分かっていないので、おかしなことをしてるのだと思うのですが。。 ご教授くださいますよう、お願いします。 opendir(DIR, $dir); while ($file = readdir(DIR)){  $maru =0;  $san =0;  $batu =0;  $file =~/(.*)_(.*)/;  $name = $1;  open(IN, "$dir/$file");   while ( $line = <FIN1> )   {    chomp( $line );    if($line =~/○/){      $maru++;    }elsif($line =~/△/){      $san++;    }elsif($line =~/×/){      $batu++;    }  } push(@{$test{$name}} , $maru,$san,$batu); @gyou = ( $name , join ("," , @{$test{$name}})) ; print OUT join (",", @gyou). "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • ruby 1.9.3のrequireについて

    はじめまして。 私は今初めてrubyの勉強をしています。 使用している参考書はたのしいruby第3です。 ruby 1.9.3-P1.9.4でのrequireについて 今回質問させていただく内容としては requireを使用し外部ファイルを読み込もうとするとエラーになってしま.います。 同じディレクトリにファイルを置いています。 ディレクトリ構造として c:\workspaceの中にscopetest.rbとsub.rbをおいております。 scopetest.rb $x = 0 x = 0 require "sub" p $x p x sub.rb $x = 1 x = 1 実行コマンド ruby scopetestr.rb エラー C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- sub (LoadError) from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:i n `require' from scopetest.rb:4:in `<main>' 参考書と同じにやっているのですがエラーがでてしまいます。 初歩的な質問かもしれませんがよろしくおねがいいたします。

    • ベストアンサー
    • Ruby
  • RubyとMeadow(Emacs)について

    RubyとMeadow(Emacs)について 自分のパソコンにRubyとMeadowをインストールしたんですが、 Meadowでソースプログラムを作ってからコマンドプロンプトでそれを実行しようとすると ’ruby’は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出てきてしまいます。 どうすれば実行できるのでしょうか? 教えていただきたいです。 ちなみにこれは夏休みの宿題で、 プリントに書かれていたとおりにやりました。 間違いがないか自分でなんども確認しましたが、 たぶん書いてあることは間違っていないと思います。 どのようにやったかというと、 Meadowでhello.rbというファイルに print("Hello, Ruby World !\n") と打ち込み、c:\progIに保存。 コマンドプロンプトを開いて progIに移動し、 ruby hello.rb →[Enter] です。

    • ベストアンサー
    • Ruby
  • Ruby1.8.7 ファイルアップロードCGI

    CGI を使ったファイルのアップローダを作りたくて、今日初めて Ruby を触っていますが、質問があります。 アップロードするファイル本体以外の情報を name="version" で受け取って、保存するディレクトリを分けるようにしています。書きかけのコードは以下の通りです。(タブによるインデントが入らなかったので、アンダースコアで表現しています) ----------ここからソースコード---------- #!/usr/local/bin/ruby require "cgi" begin __print "Content-Type: text/plain\n\n" __cgi = CGI.new __print "Ruby version is " __print RUBY_VERSION,"\n" __print "filename = " __print cgi['upload_file'].original_filename, "\n" __file = cgi.params['version'][0] __if file.class == StringIO then ____print "File is StringIO Class.\n" ____print "version = " ____print cgi["version"].string, "\n" ____if File.exist? cgi["version"].string then ______print "このバージョンのディレクトリは既に存在しているため、ディレクトリは作成されませんでした。" ____else ______print "ディレクトリが存在しないので作成します。" ______Dir::mkdir(cgi["version"].string, 0755) ____end ____OUTPUT_DIR = (cgi["version"].string + "/") ____open(OUTPUT_DIR + cgi['upload_file'].original_filename, "w") {|fh| ____fh.binmode ____fh.write cgi['upload_file'].read ____} __else ____print "File is TempFile Class.\n" ____#ここから先が書きかけで分からない部分です。 __end rescue => e __print "Error!" + e end ----------ここまでソースコード---------- Ruby の CGI モジュールを使っていますが、受け取ったファイルが 10240 バイト未満だと StringIOオブジェクト、10240 バイト以上だと TempFile オブジェクトになるという規則があるそうで、オブジェクトの種類によって分岐させています。 StringIO オブジェクト(10240バイト未満の送信)の場合はこれで想定通りに動いたのですが、TempFile オブジェクトと判別された場合に、 version のテキストフィールドの文字列を print により表示(出力)したりディレクトリ名にしたりする方法が分かりません。また、ファイル本体 upload_file は TempFile オブジェクトの場合でも同じ記述でファイルに保存できますでしょうか? サーバにインストールされている Ruby のバージョンは 1.8.7 です。

専門家に質問してみよう