Ruby: How to convert a string to boolean

前端 未结 14 796
抹茶落季
抹茶落季 2020-12-08 13:16

I have a value that will be one of four things: boolean true, boolean false, the string \"true\", or the string \"false\". I want to convert the string to a boolean if it i

相关标签:
14条回答
  • 2020-12-08 13:42

    Close to what is already posted, but without the redundant parameter:

    class String
        def true?
            self.to_s.downcase == "true"
        end
    end
    

    usage:

    do_stuff = "true"
    
    if do_stuff.true?
        #do stuff
    end
    
    0 讨论(0)
  • 2020-12-08 13:43

    In a rails 5.1 app, I use this core extension built on top of ActiveRecord::Type::Boolean. It is working perfectly for me when I deserialize boolean from JSON string.

    https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html

    # app/lib/core_extensions/string.rb
    module CoreExtensions
      module String
        def to_bool
          ActiveRecord::Type::Boolean.new.deserialize(downcase.strip)
        end
      end
    end
    

    initialize core extensions

    # config/initializers/core_extensions.rb
    String.include CoreExtensions::String
    

    rspec

    # spec/lib/core_extensions/string_spec.rb
    describe CoreExtensions::String do
      describe "#to_bool" do
        %w[0 f F false FALSE False off OFF Off].each do |falsey_string|
          it "converts #{falsey_string} to false" do
            expect(falsey_string.to_bool).to eq(false)
          end
        end
      end
    end
    
    0 讨论(0)
  • 2020-12-08 13:46
    if value.to_s == 'true'
      true
    elsif value.to_s == 'false'
      false
    end
    
    0 讨论(0)
  • 2020-12-08 13:48

    A gem like https://rubygems.org/gems/to_bool can be used, but it can easily be written in one line using a regex or ternary.

    regex example:

    boolean = (var.to_s =~ /^true$/i) == 0
    

    ternary example:

    boolean = var.to_s.eql?('true') ? true : false
    

    The advantage to the regex method is that regular expressions are flexible and can match a wide variety of patterns. For example, if you suspect that var could be any of "True", "False", 'T', 'F', 't', or 'f', then you can modify the regex:

    boolean = (var.to_s =~ /^[Tt].*$/i) == 0
    
    0 讨论(0)
  • 2020-12-08 13:52

    I have a little hack for this one. JSON.parse('false') will return false and JSON.parse('true') will return true. But this doesn't work with JSON.parse(true || false). So, if you use something like JSON.parse(your_value.to_s) it should achieve your goal in a simple but hacky way.

    0 讨论(0)
  • 2020-12-08 13:54
    h = { "true"=>true, true=>true, "false"=>false, false=>false }
    
    ["true", true, "false", false].map { |e| h[e] }
      #=> [true, true, false, false] 
    
    0 讨论(0)
提交回复
热议问题