Локализация номера типа ввода

Я работаю над веб-приложением, запущенным в Chrome, где у меня есть входные данные с типом number, В моей локали запятые используются для десятичных чисел, а пробел используется для разделения тысяч (это не так важно), но когда я ввожу эти символы в числовое поле, они просто удаляются, эффективно увеличивая денежные суммы на сотню.

Я установил язык как в настройках браузера, так и на странице, но мне все еще нужно использовать точку для десятичных дробей. Можно ли как-то настроить поле для приема запятых?

В качестве альтернативы, мне придется решить эту проблему с помощью JavaScript. Я думаю, я мог бы обработать событие keydown и изменить запятые на точки по мере того, как пользователь вводит данные, но это не дало бы хорошего пользовательского опыта, не так ли? Итак, как я могу добиться этого с минимальными затратами в моем коде?

5 ответов

HTML5 input type=number неадекватен с точки зрения локализации, как из-за определения, так и из-за реализаций. Он предназначен для локализации, но в соответствии с языком браузера, который вы не можете установить или даже знать как дизайнер / автор.

На моем Chrome input type=number step=0.001 принимает 1,2 (с запятой) и отправляет его как 1,2, а также принимает 1.200 (с точкой), визуально преобразовывая его в 1200 и отправляя как таковой. Именно так и должно быть, более или менее, когда локаль браузера - финская. Но он не принимает 1 200 (что является стандартным способом написания 1200 на финском языке) и вместо этого отправляет только цифру 1.

Так что это довольно безнадежно. Используйте любые виджеты JavaScript, которые вы можете найти, или простое поле ввода текста. Все, вероятно, лучше, чем input type=number если все пользователи не используют браузеры с одинаковым языковым стандартом и не имеют одинаковых ожиданий в отношении формата чисел.

Если вам не нужны тики вверх / вниз, тогда следуйте обходному пути:

только для немецкой запятой (,):

<input type="text" pattern="[0-9]+([,][0-9]{1,2})?" name="amount">

только точка (.):

<input type="text" pattern="[0-9]+([\.][0-9]{1,2})?" name="amount">

и то и другое, но не вместе: (не 1000 разделитель)

<input type="text" pattern="[0-9]+([\.|,][0-9]{1,2})?" name="amount">

иначе номер для немецкого / немецкого:

<input name="myinput" value="0" step="0.01" lang="de-DE" type="number">

и стиль с помощью:

input[type=number] {
    -moz-appearance:textfield;
    -webkit-appearance: none;
    appearance: textfield;
}

Спецификация ясна: в качестве десятичного разделителя допускается только точка. Это до браузеров, чтобы обеспечить поддержку локализации для форм. Тысячи разделителей не допускаются.

К сожалению, эти символы не допускаются в <input type="number">

Смотрите спецификации здесь: http://w3c.github.io/html-reference/datatypes.html

Вы хотите этот формат? http://jsfiddle.net/S8rqY/

В то время как Chrome использует настройку браузера, Firefox нет. По крайней мере, не всегда - например, когда есть атрибут lang в <html> тег, Firefox использует это.

Однако вы можете передать атрибут lang также в <input>пометить напрямую. Комбинируя это с API-интерфейсом Navigator, можно имитировать поведение хрома.

Минимальный пример в React:

      <input
  type="number"
  lang={navigator.language}
/>
Другие вопросы по тегам