Je veux que Apple
et Apple
la comparaison soit true
. Actuellement
"Apple" == "Apple" # returns TRUE
"Apple" == "Apple" # returns FALSE
Vous recherchez casecmp
. Il retourne 0
si deux chaînes sont égales, sans distinction de casse.
str1.casecmp(str2) == 0
"Apple".casecmp("Apple") == 0
#=> true
Alternativement, vous pouvez convertir les deux chaînes en minuscules ( str.downcase
) et comparez pour l'égalité.
En Ruby 2.4.0 vous avez: casecmp?(other_str) → true, false, or nil
"abcdef".casecmp?("abcde") #=> false
"aBcDeF".casecmp?("abcdef") #=> true
"abcdef".casecmp?("abcdefg") #=> false
"abcdef".casecmp?("ABCDEF") #=> true
Si vous devez comparer des chaînes UTF-8 en ignorant les cas:
>> str1 = "Мария"
=> "Мария"
>> str2 = "мария"
=> "мария"
>> str1.casecmp(str2) == 0
=> false
>> require 'active_support/all'
=> true
>> str1.mb_chars.downcase.to_s.casecmp(str2.mb_chars.downcase.to_s) == 0
=> true
Cela fonctionne de cette façon dans Ruby 2.3.1 et les versions antérieures.
Pour une plus petite empreinte mémoire, vous pouvez choisir cherry string/multibyte
:
require 'active_support'
require 'active_support/core_ext/string/multibyte'
Edit, Ruby 2.4.0:
>> str1.casecmp(str2) == 0
=> false
Donc, casecmp
ne fonctionne pas dans la version 2.4.0; Cependant en 2.4.0, on peut comparer les chaînes UTF-8 manuellement sans active_support
gem:
>> str1.downcase == str2.downcase
=> true
casecmp et zéro? are Ruby méthodes intégrées. casecmp renvoie 0 si deux chaînes sont égales, sans tenir compte de la casse et que zéro? recherche la valeur zéro (== 0)
str1.casecmp(str2).zero?
Pour Ruby 2.4 fonctionne correctement casecmp? pour les chaînes utf-8 (mb_chars pas nécessaire):
2.4.1 :062 > 'строка1'.casecmp?('СтроКа1')
=> true
mais casecmp ne fonctionne pas pour utf-8:
2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
=> 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
=> 0