Здравствуйте, Shtole, Вы писали:
S>Очень глубокий ответ, очень. Но я его не понял.
S>Вот у нас поле ввода.
Это — совсем другой сценарий, чем просто ввод и вывод. Если рассматривать ввод и вывод отдельно, то всё просто: при вводе игнорируем пробелы, при выводе вставляем туда, куда нужно.
S>Вот юзер хочет ввести число: 1 000 000 001 (или 1 000 000 002). Он жмакает по цифровой клавиатуре и видит: 10000000001.
S>Вот юзер, конечно, думает: а не нажал ли я лишнего? И начинает считать нули, выделяя текст/расставляя группы пробелами, которые потом стирает/водя грязным ногтём по экрану/иным способом в рамках фантазии.
S>Это проблема. Юзер должен сразу видеть, что он вводит.
S>Как выглядит решение «в терминах "преобразование числа в строку в соответствии с определёнными культурными предпочтениями и техническими особенностями"»?
S>А чтобы стало веселее, я пошёл домой за ружьём представим себе, что это поле ввода калькулятора, куда вводятся выражения:
S>S>1 000 000 001 + 1
S>1 000 000 001 / pi
S>sin(1 000 000 001)
S>
S>Как видите, в этом юз-кейсе:
S>1. Проблема стоит особенно остро (в львиной доле случаев вводятся числа, иногда большие);
S>2. Мы не можем ограничиться вводом символов, составляющих число и не можем просто взять специальный контрол «поле ввода числа»;
S>3. Вставка пробелов и прочих разделителей чревата конфликтами с грамматикой языка.
По п3 — всё зависит от грамматики. В рамках калькулятора нет никакой проблемы игнорировать пробелы внутри чисел — это даст возможность переформатировать лексемы на лету.
S>Что касается «культурных предпочтений». Идеально было бы брать «разделитель групп» из настроек операционной системы. Но, например, браузер вам этого не даст (ибо отпечатки). Браузер даст только: а) название култур-мултур, б) интерфейс, который отформатирует число в соответствии с этой культурой. То есть, как ни настраивай юзер операционную систему, браузер всё равно сведёт всё к наибольшему общему делителю данной культуры (что сильно обесценивает саму идею).
Это уже проходит по пункту "технические средства". Браузер несколько ограничивает фантазию UX-дизайна.
S>Если я не прав, то как надо? Это первый вопрос.
Пытливый ум завсегда найдёт выход из положения. Нам, собственно, нужно уметь а) разобрать строку б) скомпоновать строку.
В рамках разбора, чтобы не ограничивать пользователя только корректными выражениями, мы будем делить весь ввод на "числа и всё остальное". Всё остальное — не трогаем, числа — переформатируем.
При разборе чисел мы будем просто игнорировать разделитель групп; узнать, что является разделителем, можно при помощи formatToParts.
Ну, а с форматированием всё хорошо — есть тот самый интерфейс.
Я не уверен, что всё это хорошо заработает в браузере в рамках текстового поля ввода — возможны тонкости с таймингом разбора/подстановки/восстановления положения курсора.
Когда у вас введены цифры 100000 и вы нажимаете 0, то отображение должно смениться с
100 000| на
1 000 000|, причём так, чтобы курсор остался на нужном месте — иначе может так оказаться, что курсор временно прыгнул в начало строки, пользователь успел ввести что-то ещё, и тут мы наконец переставили курсор "на место".
Запасной вариант — сделать ввод формул на чистом canvas.
S>Второй: ну, допустим, я прав. Как это реализовать? Естественно, в голову приходят лигатуры, как образец готового решения. Логику можно упихать в шрифт, типа «цифра до и три цифры после — увеличиваем кернинг». Решение хорошо тем, что будет работать везде, и в HTML, и в Qt, и в Скайтере. Но это же надо как-то шрифт на лету подменять.
Нет, это не заработает. Лигатуры работают слева направо, а нам надо чтобы они работали справа налево. Иначе вы получите отображение 123 456 78 вместо 12 345 678.