Сила для использования точки вместо запятой для десятичного разделителя в теге ввода номера HTML5 [дубликат]

Теперь это еще больший беспорядок, чем когда этот вопрос был впервые задан. От чтения всех ответов и сообщений в блогах, которые я мог найти, вот резюме. Я также установил эту страницу, чтобы проверить все эти методы измерения уровня масштабирования .

Редактировать (2011-12-12): я добавил проект, который можно клонировать : https://github.com/tombigel/detect-zoom

  • IE8: screen.deviceXDPI / screen.logicalXDPI (или для уровня масштабирования относительно масштабирования по умолчанию, screen.systemXDPI / screen.logicalXDPI)
  • IE7: var body = document.body,r = body.getBoundingClientRect(); return (r.left-r.right)/body.offsetWidth; (благодаря этот пример или этот ответ )
  • FF3.5 ТОЛЬКО: screen.width / ширину экрана запросов мультимедиа (см. ниже) (использует тот факт, что screen.width использует пиксели устройства, но ширина MQ использует пиксели CSS - благодаря Ширины Quirksmode )
  • FF3.6: неизвестный метод
  • FF4 +: медиа-запросы двоичного поиска (см. Ниже)
  • WebKit: https://www.chromestatus.com/feature/5737866978131968 (спасибо Teo в комментариях)
  • WebKit: измерьте предпочтительный размер div с -webkit-text-size-adjust:none.
  • WebKit: (сломанный с r72591 ) document.width / jQuery(document).width() (благодаря Дирк ван Остербош выше ). Чтобы получить соотношение по пикселям устройства (вместо относительного масштабирования по умолчанию), умножьте на window.devicePixelRatio.
  • Старый WebKit? (непроверено): parseInt(getComputedStyle(document.documentElement,null).width) / document.documentElement.clientWidth (из этот ответ )
  • Opera: document.documentElement.offsetWidth / width of position:fixed; width:100% div. здесь ( Таблица ширины Quirksmode говорит, что это ошибка, а innerWidth - CSS px). Мы используем положение: фиксированный элемент, чтобы получить ширину окна просмотра , включая пространство, в котором полосы прокрутки ; document.documentElement.clientWidth исключает эту ширину. Это нарушается с тех пор в 2011 году; Я не знаю, как увеличить уровень масштабирования в Opera.
  • Другое: Решение Flash от Sebastian
  • Ненадежность: прослушивание событий мыши и измерение изменений в screenX / change в clientX

Вот двоичный поиск для Firefox 4, так как я не знаю какой-либо переменной, где она отображается:


Dummy element to test media queries.

52
задан Revious 3 December 2014 в 16:03
поделиться

12 ответов

Я не знаю, помогает ли это, но я наткнулся на эту проблему, только с точки зрения ввода (т.е. я заметил, что мой <input type="number" /> принимал как запятую и точка при наборе значения, но только последняя привязана к модели угловой j, назначенной на вход). Поэтому я решил, записав эту краткую директиву:

.directive("replaceComma", function() {
    return {
        restrict: "A",
        link: function(scope, element) {
            element.on("keydown", function(e) {
                if(e.keyCode === 188) {
                    this.value += ".";
                    e.preventDefault();
                }
            });
        }
    };
});

Затем, на моем html, просто: <input type="number" ng-model="foo" replace-comma /> будет заменять запятые точками «на лету», чтобы пользователи не могли вводить неверные данные (из javascript, а не локальный!). Приветствия.

1
ответ дан Andrea Aloi 22 August 2018 в 12:17
поделиться
  • 1
    Привет Андреа, есть ли способ сделать это без Angular JS? Например, с jQuery? – maartenmachiels 18 March 2015 в 13:03
  • 2
    Несомненно, я полагаю, что вы могли бы писать на основе ввода числа, например, как $("input[type=number]").on("keydown", function(e) { if(e.keyCode === 188) { this.value += "."; e.preventDefault(); }}); (как только ваша страница полностью загрузилась вместе со всеми входными номерами) – Andrea Aloi 18 March 2015 в 15:40
  • 3
    Этот фрагмент не работает на хроме (проверен на v60). При вводе 888, установка свойства value выдает предупреждение о том, что 888. не является допустимым числом (для регулярного выражения требуется по крайней мере одно число после точки) и заполняет поле. Написание точки работает, хотя, вероятно, потому, что вход учитывает его значение «в процессе» и ожидает ввода большего числа цифр – svvac 11 September 2017 в 09:45

В настоящее время Firefox отличает язык HTML-элемента, в котором находится вход. Например, попробуйте эту скрипту в Firefox:

http://jsfiddle.net/ashraf_sabry_m/yzzhop75/1/

Вы увидите, что цифры на арабском языке, а запятая используется как десятичный разделитель, что соответствует арабскому. Это связано с тем, что тегу BODY присваивается атрибут lang="ar-EG".

Затем попробуйте следующее:

http://jsfiddle.net/ashraf_sabry_m/yzzhop75 / 2 /

Этот символ отображается с точкой в ​​качестве разделителя десятичных чисел, потому что вход завернут в DIV с учетом атрибута lang="en-US".

So , решение, к которому вы можете прибегнуть, состоит в том, чтобы обернуть ваши числовые входы элементом контейнера, который настроен на использование культуры, которая использует точки в качестве разделителя десятичных чисел.

15
ответ дан Ashraf Sabry 22 August 2018 в 12:17
поделиться
  • 1
    Интересно! К сожалению, он работает только в Firefox, а не в Chrome (47.0.2526.106) – user3514092 23 February 2016 в 13:44
  • 2
    Даже не в Firefox, во Франции – Aubin 3 September 2016 в 12:15
  • 3
    @Aubin Почему? fr-FR работает для меня – Ashraf Sabry 4 September 2016 в 14:10
  • 4
    1. Создайте страницу fr-FR, которая содержит форму en-US, попробуйте ввести десятичное число, подобное 123.45 и бинго! input.value пусто. :-( – Aubin 4 September 2016 в 16:28
  • 5
    Firefox уважает языковые настройки страницы. Chrome накладывает десятичный разделитель ОС или браузера? Edge налагает десятичную точку, независимо от языковых настроек страницы или браузера или ОС. Какой беспорядок. – bbsimonbb 2 June 2017 в 09:34
-1
ответ дан Cleber Spirlandeli 22 August 2018 в 12:17
поделиться

Насколько я понимаю, HTML5 input type="number всегда возвращает input.value как string.

По-видимому, input.valueAsNumber возвращает текущее значение как число с плавающей запятой. Вы можете использовать это, чтобы вернуть нужное значение.

См. http://diveintohtml5.info/forms.html#type-number

0
ответ дан Ed Chapel 22 August 2018 в 12:17
поделиться

Согласно spec , вы можете использовать any как значение атрибута step:

<input type="number" step="any">
8
ответ дан Halil Özgür 22 August 2018 в 12:17
поделиться

один параметр - javascript parseFloat() ... никогда не анализировать «text chain" --> 12.3456 с точкой в ​​int ... 123456 (int удалить точку) разделить текстовую цепочку на FLOAT ...

, чтобы отправить эти коорды серверу, отправляет цепочку текста. HTTP отправляет только TEXT

в клиенте, чтобы не разбирать входные координаты с помощью «int», работа с текстовыми строками

, если вы печатаете шнуры в html с php или похожим ... float to text и печатаете в html

0
ответ дан jbutler483 22 August 2018 в 12:17
поделиться

Я нашел статью в блоге, которая, кажется, объясняет что-то, связанное с этим: http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/

В заключение:

  • step помогает определить область допустимых значений
  • , по умолчанию step - 1
  • , поэтому домен по умолчанию является целым числом (между min и max, включительно, если задано)

Я бы предположил, что это сопряжено с двусмысленностью использования запятой как тысячный разделитель против запятой в виде десятичной точки, а ваш 51,983 на самом деле странно разобран пятьдесят одна тысяча девятьсот восемь три.

По-видимому, вы можете использовать step="any" для расширения домен для всех рациональных чисел в диапазоне, однако я сам не пробовал. Для широты и долготы я успешно использовал:

<input name="lat" type="number" min="-90.000000" max="90.000000" step="0.000001">
<input name="lon" type="number" min="-180.000000" max="180.000000" step="0.000001">

Это может быть не очень, но он работает.

Изменить: обновленная ссылка - https: // www.isotoma.com/blog/2012/03/02/html5-input-typenumber-and-decimalsfloats-in-chrome/

1
ответ дан Matty K 22 August 2018 в 12:17
поделиться
  • 1
    В этом случае хорошо, что я написал резюме, а затем экстраполировал, а? – Matty K 7 September 2016 в 05:50

Рассматривали ли вы использование Javascript для этого?

$('input').val($('input').val().replace(',', '.'));

0
ответ дан mhrvatin 22 August 2018 в 12:17
поделиться
  • 1
    На хром с входом [type = number] не работает. Запятая всегда отображается. – Revious 10 December 2014 в 14:32

К сожалению, охват этого поля ввода в современных браузерах очень низок:

http://caniuse.com/#feat=input-number

Поэтому я рекомендую рассчитывать на резервную копию и полагаться на загруженный с тяжелой загрузкой ввод [type = text] для выполнения задания, пока это правило не будет принято.

До сих пор только Chrome, Safari и Opera имели аккуратную реализацию, но все остальные браузеры не работают. Некоторые из них даже не поддерживают десятичные знаки (например, BB10)!

2
ответ дан opalenzuela 22 August 2018 в 12:17
поделиться
  • 1
    Использование библиотеки, такой как number.js , может помочь с присущими проблемами наличия нескольких языков на этой планете. – pintxo 10 December 2014 в 14:14

С атрибутом step , указанным в точности десятичных знаков, вы хотите, чтобы ваш числовой ввод html5 принимал десятичные значения. например. принимать значения, подобные 10,56; i означает 2 десятичных числа, сделайте следующее:

<input type="number" step="0.01" min="0" lang="en" value="1.99">

Вы можете дополнительно указать атрибут max для максимально допустимого значения.

Изменить Добавить атрибут lang в элемент ввода с языковым значением, которое форматирует десятичные знаки с точкой вместо запятой

18
ответ дан Peter 22 August 2018 в 12:17
поделиться
  • 1
    Это все еще не работает :-( Локальные значения на стороне клиента всегда преобразуют десятичную точку в десятичной запятой независимо от шага или атрибута value. :-( – maartenmachiels 27 December 2013 в 11:48
  • 2
    Насколько я понимаю, вопрос заключается не в том, чтобы иметь десятичный разделитель. Вопрос в том, чтобы иметь. вместо ',', когда предпочитает языковой стандарт клиента ','. – Emanuele Paolini 16 January 2015 в 17:38
  • 3
    независимо от того, какой десятичный разделитель вы используете в атрибуте step - браузер все равно будет локализовать его. То есть, с указанием вашего примера - в большинстве европейских стран число отображаемых будет 10,56 – khartvin 28 September 2016 в 12:13
  • 4
    Я вернулся и перечитал вопрос через 5 лет и задался вопросом, почему я дал ответ выше. См. Редактирование, пожалуйста – Peter 11 July 2018 в 22:23

Использовать lang атрибут на входе. Locale на моем веб-приложении fr_FR, lang = "en_EN" на номере ввода, и я могу без разницы использовать запятую или точку. Firefox всегда отображает точку, Chrome показывает запятую. Но оба партнера действительны.

0
ответ дан zian974 22 August 2018 в 12:17
поделиться

1) 51,983 - номер строкового типа не принимает запятую

, поэтому u должен установить его как текст

<input type="text" name="commanumber" id="commanumber" value="1,99" step='0.01' min='0' />

заменить, с помощью.

и изменить атрибут типа на число

$(document).ready(function() {
    var s = $('#commanumber').val().replace(/\,/g, '.');   
    $('#commanumber').attr('type','number');   
    $('#commanumber').val(s);   
});

Проверить http://jsfiddle.net/ydf3kxgu/

Надеюсь, что это решает вашу проблему

1
ответ дан Ярослав Рахматуллин 22 August 2018 в 12:17
поделиться
  • 1
    что-то пропустило, потому что, принять более чем одну "точку" – Nuri YILMAZ 3 July 2018 в 21:11
Другие вопросы по тегам:

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