Converting upper-case string into title-case using Ruby

后端 未结 10 1371
小鲜肉
小鲜肉 2020-12-25 10:46

I\'m trying to convert an all-uppercase string in Ruby into a lower case one, but with each word\'s first character being upper case. Example:

convert \"MY STRING HE

相关标签:
10条回答
  • 2020-12-25 11:25

    If you're using Rails (really all you need is ActiveSupport, which is part of Rails), you can use titleize:

    "MY STRING HERE".titleize
    # => "My String Here"
    
    0 讨论(0)
  • 2020-12-25 11:27

    The ruby core itself has no support to convert a string from upper (word) case to capitalized word case.

    So you need either to make your own implementation or use an existing gem.

    There is a small ruby gem called lucky_case which allows you to convert a string from any of the 10+ supported cases to another case easily:

    require 'lucky_case'
    
    # to get capital word case as string
    LuckyCase.capital_word_case('MY STRING HERE')    # => 'My String Here'
    # or the opposite way
    LuckyCase.upper_word_case('Capital Word Case')   # => 'MY STRING HERE'
    

    You can even monkey patch the String class if you want to:

    require 'lucky_case/string'
    
    'MY STRING HERE'.capital_word_case  # => 'My String Here'
    'MY STRING HERE'.capital_word_case! # => 'My String Here' and overwriting original
    

    Have a look at the offical repository for more examples and documentation:

    https://github.com/magynhard/lucky_case

    0 讨论(0)
  • 2020-12-25 11:32
    "HELLO WORLD HOW ARE YOU".gsub(/\w+/) do |word|
      word.capitalize
    end
    #=> "Hello World How Are You"
    
    0 讨论(0)
  • 2020-12-25 11:33

    I've try to improve code... ready for critics and suggestions.

    class Book
        attr_accessor :title
        def title=(new_title)
        notcap=%w(and the a in of an)
        str=''
        new_title.gsub(/(\w|\s)\w+/) do |word|
            word.strip!
            if not notcap.include? word
                   word.capitalize! 
            end
           str += ' ' + word 
        end
        str.strip!
        str = str[0].upcase + str[1..-1]
        @title = str
       end
    end
    
    0 讨论(0)
  • 2020-12-25 11:34

    From ActiveSupport

    "MY STRING HERE".gsub(/\b('?[a-z])/) { $1.capitalize }
    

    If you are using Rails/ActiveSupport, the method is already available for free.

    0 讨论(0)
  • 2020-12-25 11:38

    While trying to come up with my own method (included below for reference), I realized that there's some pretty nasty corner cases. Better just use the method already provided in Facets, the mostest awesomest Ruby library evar:

    require 'facets/string/titlecase'
    
    class String
      def titleize
        split(/(\W)/).map(&:capitalize).join
      end
    end
    
    require 'test/unit'
    class TestStringTitlecaseAndTitleize < Test::Unit::TestCase
      def setup
        @str = "i just saw \"twilight: new moon\", and man!   it's crap."
        @res = "I Just Saw \"Twilight: New Moon\", And Man!   It's Crap."
      end
      def test_that_facets_string_titlecase_works
        assert_equal @res, @str.titlecase
      end
      def test_that_my_own_broken_string_titleize_works
        assert_equal @res, @str.titleize # FAIL
      end
    end
    

    If you want something that more closely complies to typical writing style guidelines (i.e. does not capitalize words like "and"), there are a couple of "titleize" gems on GitHub.

    0 讨论(0)
提交回复
热议问题