Как обычно, есть несколько способов сделать одно и то же, но я бы не стал использовать Number.prototype.toLocaleString
, поскольку он может возвращать разные значения в зависимости от настроек пользователя.
Я также не рекомендую расширять Number.prototype
- расширение прототипов нативных объектов является плохой практикой, поскольку оно может вызывать конфликты с чужим кодом (например, библиотеками / фреймворками / плагинами) и может быть несовместимо с будущими реализациями JavaScript / версии.
Я считаю, что Регулярные выражения являются лучшим подходом к решению проблемы, вот моя реализация:
/**
* Converts number into currency format
* @param {number} number Number that should be converted.
* @param {string} [decimalSeparator] Decimal separator, defaults to '.'.
* @param {string} [thousandsSeparator] Thousands separator, defaults to ','.
* @param {int} [nDecimalDigits] Number of decimal digits, defaults to `2`.
* @return {string} Formatted string (e.g. numberToCurrency(12345.67) returns '12,345.67')
*/
function numberToCurrency(number, decimalSeparator, thousandsSeparator, nDecimalDigits){
//default values
decimalSeparator = decimalSeparator || '.';
thousandsSeparator = thousandsSeparator || ',';
nDecimalDigits = nDecimalDigits == null? 2 : nDecimalDigits;
var fixed = number.toFixed(nDecimalDigits), //limit/add decimal digits
parts = new RegExp('^(-?\\d{1,3})((?:\\d{3})+)(\\.(\\d{'+ nDecimalDigits +'}))? отредактировано 2010/08/30: добавлена опция для установки количества десятичных цифр. отредактировано 2011/08/23: добавлена опция для установки количества десятичных цифр на ноль.
).exec( fixed ); //separate begin [$1], middle [$2] and decimal digits [$4]
if(parts){ //number >= 1000 || number <= -1000
return parts[1] + parts[2].replace(/\d{3}/g, thousandsSeparator + '[110]amp;') + (parts[4] ? decimalSeparator + parts[4] : '');
}else{
return fixed.replace('.', decimalSeparator);
}
}
отредактировано 2010/08/30: добавлена опция для установки количества десятичных цифр. отредактировано 2011/08/23: добавлена опция для установки количества десятичных цифр на ноль.
Обсуждение нескольких раскрывающихся списков и одного текстового поля вызывает некоторые интересные дискуссии об удобстве использования. Обычно используются отдельные поля штата и страны. Возможно, вы нарушаете правило «не заставляйте меня думать», но автозаполнение помогает объяснить, что требуется.
Якоб Нильсен утверждает, что пользователям проще использовать отдельные текстовые поля для адресов:
Такая информация часто зашита в пальцы пользователей, и необходимость выберите такие параметры из разрывов меню стандартная парадигма для входа информации и даже может создать больше работают для пользователей ( http://www.useit.com/alertbox/20001112.html )
С другой стороны, выбор информации из фиксированных списков будет означать меньше места для ошибок, и некоторые люди предпочитают используйте мышь (например, эти люди переходят в меню редактирования, чтобы получить доступ к таким командам, как копирование и вставка).
Вам нужно оценить свою целевую аудиторию и позвонить.
One concern is whether it works without JavaScript or not. If your customers for some reason or other (there are several of them) do not have JavaScript enabled, or doesn't even have browsers supporting it (e.g. on a cell phone), you could get malformed input that your site may not handle correctly.
Для записи, почтовый индекс не всегда однозначно идентифицирует город. см. здесь Of course in practice, it usually does, and even if it doesn't, it would reduce the options considerably.
Это не проблема. Как только появится автозаполнение, люди поймут.
Да, вы должны найти способ перенести его или поставить это поле в верхней части адреса. Если он уже введен, люди не подумают, что им придется вводить его снова.
Когда ваш магазин будет расти, вам понадобится чачинг. В любом случае. На всех уровнях.
Я согласен . Просто исправьте некоторые незначительные проблемы.: -)