50 lines
1.0 KiB
Ruby
50 lines
1.0 KiB
Ruby
class String
|
||
CHARACTER_MAPPING = {
|
||
'ك' => 'ک',
|
||
'دِ' => 'د',
|
||
'بِ' => 'ب',
|
||
'زِ' => 'ز',
|
||
'ذِ' => 'ذ',
|
||
'شِ' => 'ش',
|
||
'سِ' => 'س',
|
||
'ى' => 'ی',
|
||
'ي' => 'ی',
|
||
'١' => '۱',
|
||
'٢' => '۲',
|
||
'٣' => '۳',
|
||
'٤' => '۴',
|
||
'٥' => '۵',
|
||
'٦' => '۶',
|
||
'٧' => '۷',
|
||
'٨' => '۸',
|
||
'٩' => '۹',
|
||
'٠' => '۰'
|
||
}.freeze
|
||
|
||
def to_persian
|
||
gsub(Regexp.union(CHARACTER_MAPPING.keys), CHARACTER_MAPPING)
|
||
end
|
||
|
||
def percent_match(mold)
|
||
mold = mold.to_s.to_persian
|
||
str = self.to_persian
|
||
char_cost = (100.to_f / length).round(2)
|
||
matching = 0
|
||
str_index = 0
|
||
mold_index = 0
|
||
str.each_char.with_index do |_char, index|
|
||
break if mold[mold_index].blank?
|
||
|
||
if mold[mold_index] != str[str_index]
|
||
mold_index = index - 1 if mold.length < str.length
|
||
str_index = index - 1 if mold.length > str.length
|
||
else
|
||
matching += char_cost
|
||
end
|
||
str_index += 1
|
||
mold_index += 1
|
||
end
|
||
matching.round
|
||
end
|
||
end
|