Задать вопрос
dicem
@dicem

Как определить верхнерегистровый аналог символа?

Суть такова, нужно в строке поменять регистр без использования toLowerCase, toUpperCase.
Понял, что можно тупо пройтись посимвольно и менять регистр, но теперь мне совершенно не ясно каким макаром я уткнувшись в какой либо символ ( скажем в "а" ) я смогу вернуть его верхнерегистровый аналог ( т.е. "A" ).
Я понимаю, что можно тупо иметь массив символов разного регистра и тупо перебирать символы в массиве, но мне почему то кажется, что есть более изящное решение или если же я заблуждаюсь буду рад услышать вас.
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 3
dollar
@dollar
Делай добро и бросай его в воду.
Можно иметь дело с кодами символов. Английские, русские, и не забудьте про выскочку "Ё". Почти все символы в одном алфавите имеют одно и то же смещение по коду с противоположным регистром. Думаю, идея понятна.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для русских и английских символов можно так:
String.fromCharCode('б'.charCodeAt(0)-32)
Исключение - буква 'ё'.
Для остальных символов надо смотреть таблицу Unicode.
Возможны сложные варианты, например в немецком 'ß' (эсцет) в верхнем регистре пишется как 'SS', а в некоторых алфавитах нет понятия верхнего или нижнего регистра (например, в китайском).
Ответ написан
Комментировать
dicem
@dicem Автор вопроса
String.prototype.modifyStr = function(UpDown = 'Up', invertFirstLetter = false) {

	let workingLine = String(this)
		
	if (UpDown) {
		workingLine = String(this).replace( /[a-zA-Z]|[а-яА-Я]/g, match => {
			if (match == match.match(/[a-z]|[а-я]/)) {
				return String.fromCharCode(match.charCodeAt(0) - ((match == 'ё') ? 80 : 32) )
			}
			else return match
		})
	} else if (!UpDown){
		workingLine = String(this).replace( /[a-zA-Z]|[а-яА-Я]/g, match => {
			if (match == match.match(/[A-Z]|[А-Я]/)) {
				return String.fromCharCode(match.charCodeAt(0) + ((match == 'ё') ? 80 : 32) )
			}
			else return match
		})
	}

	if (invertFirstLetter) {
		let firstLetter = workingLine[0],
			newLetter

		if ( firstLetter == firstLetter.match( /[a-z]|[а-я]/g ) ) {
			newLetter = String.fromCharCode(firstLetter.charCodeAt(0) - ((firstLetter == 'ё') ? 80 : 32) )
		} else if ( firstLetter == firstLetter.match( /[A-Z]|[А-Я]/g ) ) {
			newLetter = String.fromCharCode(firstLetter.charCodeAt(0) + ((firstLetter == 'ё') ? 80 : 32) )
		}

		return workingLine.replace(firstLetter, newLetter)
	} else return workingLine

}


Реализовал таким макаром
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@DanKud
Перебирать ничего не нужно. Достаточно просто задать ассоциативный массив, где ключом будет маленькая буква, а значением большая:
var obj = {
    а: 'А',
    б: 'Б',
    в: 'В',
    г: 'Г',
    д: 'Д'
}

var letter = 'в';

console.log(obj[letter]);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы