введення html5 для грошей / валюти


80

Здається, я не можу зрозуміти, що використовувати для прийняття грошових цінностей у формі.

Я намагався...

<input type="number" min="0" max="10000" step="1" name="Broker_Fees" id="broker_fees" required="required">

Але це тоді не дозволить вводити пенси.

Я хочу, щоб інкрементальна кнопка управління зросла у фунтах, але все одно хочу можливість введення пенсів.

Хто хотів би використовувати поступову кнопку, яка переміщувалась на 1p за раз?

Можливо, я використовую неправильний контроль, але не можу знайти контроль за грошима / валютою?

Чи може хтось порадити найкращий спосіб прийняття грошових значень (включаючи коми, десяткові знаки та символ валюти) за допомогою HTML5?

Дякую, 1DMF


Ви повинні вказати stepатрибут із десятковими знаками. Дивіться: Чи існує тип плаваючого введення в HTML (5)?
feeela

1
Будь ласка, прочитайте питання ще раз і переконайтеся, що розумієте, що я це вже зробив, і це призводить до небажаних результатів ... як це може бути дублюванням іншого потоку за цих обставин.
1DMF

Ну, ви просите "найкращий спосіб прийняти грошові оцінки". Прийняття вводу - це не те саме, що надання альтернативних методів введення. За допомогою введення числа користувач все ще може безпосередньо вставити дійсне число, яке відповідає заданим атрибутам. Ви все ще можете додати додаткові кнопки, які збільшуються на фунти ...
feeela

На жаль, ви не можете керувати цим за допомогою HTML5. Але, можливо, це може бути для вас цікаво: jsfiddle.net/trixta/UC6tG/embedded/result,html,js,css
Олександр Фаркас

Дякую farkas, але я, здається, не можу змусити це працювати, кнопки обертання нічого не роблять, і я також не можу ввести введення. Здається, це працює у FF, але не в IE
1DMF

Відповіді:


68

Увімкнення дробів / центів / десяткових знаків для введення цифр

Для того, щоб дозволити дроби (центи) на введенні числа HTML5, вам потрібно вказати атрибут "step" = = any:

<input type="number" min="1" step="any" />

Це спеціально не дозволить Chrome відображати помилку при введенні десяткової / дробової валюти у вхідні дані. Mozilla, IE тощо ... не помиляйтесь, якщо забудете вказати step="any". Специфікація W3C стверджує, що step = "any", дійсно, має бути необхідним для отримання десяткових знаків. Отже, вам неодмінно слід ним скористатися. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number#step

Зверніть увагу, що якщо ви хочете, щоб кнопки вгору / вниз виконували певну деталізацію, тоді ви повинні вказати числовий крок, такий як ".01".

Крім того, введення цифр зараз досить широко підтримується (> 90% користувачів).


Які варіанти введення існують для грошей / валюти?

Заголовок питання з тих пір змінився і набув дещо іншого значення. Можна прийняти як введення цифр, так і текст, щоб прийняти гроші / десяткові знаки.

Для поля введення валюти / грошей рекомендується використовувати тип введення числа та вказати відповідні атрибути, як зазначено вище. Станом на 2020 рік, не існує специфікації W3C щодо фактичного типу введення валюти або грошей.

Основною причиною є те, що він автоматично примушує користувачів вводити дійсний стандартний формат валюти та забороняє будь-який буквено-цифровий текст. З огляду на це, ви, звичайно, можете використовувати звичайний введення тексту та виконувати певну обробку, щоб захопити лише числове / десяткове значення (у цьому випадку також має бути перевірка на стороні сервера).

В ОП детально викладено вимоги щодо символів валюти та коми. Якщо ви хочете подібну логіку / форматування (станом на 2020 рік), вам потрібно буде створити власну логіку JS для введення тексту або знайти плагін.


55

Спробуйте скористатися step="0.01", тоді кожен раз це буде крок на копійку.

наприклад:

<input type="number" min="0.00" max="10000.00" step="0.01" />


4
Це добре працює. Але варто зауважити, що він проходить через цифри типу "1,28 ... 1,29 ... 1,3 ... 1,31 ...". Тобто кінцеві нулі відсутні (оскільки це число, а не валюта). Пов’язане: Як я можу зробити так, щоб поле чисел HTML5 відображало нулі?
Duncan Jones

і пам’ятайте, не всі мови використовують десяткову для своєї грошової системи.
Амірреза

30

За допомогою Number.prototype.toLocaleString javascript :

var currencyInput = document.querySelector('input[type="currency"]')
var currency = 'GBP' // https://www.currency-iso.org/dam/downloads/lists/list_one.xml

 // format inital value
onBlur({target:currencyInput})

// bind event listeners
currencyInput.addEventListener('focus', onFocus)
currencyInput.addEventListener('blur', onBlur)


function localStringToNumber( s ){
  return Number(String(s).replace(/[^0-9.-]+/g,""))
}

function onFocus(e){
  var value = e.target.value;
  e.target.value = value ? localStringToNumber(value) : ''
}

function onBlur(e){
  var value = e.target.value

  var options = {
      maximumFractionDigits : 2,
      currency              : currency,
      style                 : "currency",
      currencyDisplay       : "symbol"
  }
  
  e.target.value = (value || value === 0) 
    ? localStringToNumber(value).toLocaleString(undefined, options)
    : ''
}
input{
  padding: 10px;
  font: 20px Arial;
  width: 70%;
}
<input type='currency' value="123" placeholder='Type a number & click outside' />


Це акуратне рішення, але остерігайтеся, що перетворення localStringToNumber не вдасться для користувачів у деяких країнах. Наприклад, Франція використовує кому для десяткової коми. У цьому випадку початкове значення 123 перетворюється на 123,00 (правильно), але потім змінюється на 12300 у фокусі та 12300,00 у розмитті. По суті, кожен фокус і розмиття мимоволі помножує значення на 100!
peteredhead

@peteredhead - як відтворити? Ви змінили currencyзмінну на щось інше?
vsync

Першим аргументом toLocaleString є локаль, яка використовується для форматування. У вашому коді він встановлений невизначеним, тому використовує налаштування браузера / системи. Якщо ви хочете перевірити, як це буде працювати для користувача в іншій країні, ви можете встановити для нього значення "fr-FR", наприклад
peteredhead

Дуже цікаво. Ось список країн, у яких використовується кома проти десяткової коми
vsync

Я бачу, дуже важко перетворити числа (в різних регіонах, які представлені у вигляді рядків ) назад у числа. Існує багато різних числівникових систем. Це зажадає виявлення правильної локалі та відповідного застосування функції перетворення. багато функцій перетворення слід підготувати заздалегідь, що призведе до здуття кодової бази. так сумно.
vsync

2

Ну, врешті-решт, мені довелося піти на компроміс, впровадивши рішення HTML5 / CSS, відмовившись від кнопок збільшення в IE (вони все одно трохи зламані в FF!), Але отримавши перевірку чисельності, яку не надає спікер JQuery. Хоча мені довелося піти з кроком цілих чисел.

span.gbp {
    float: left;
    text-align: left;
}

span.gbp::before {
    float: left;
    content: "\00a3"; /* £ */
    padding: 3px 4px 3px 3px;
}

span.gbp input {
     width: 280px !important;
}
<label for="broker_fees">Broker Fees</label>
<span class="gbp">
    <input type="number" placeholder="Enter whole GBP (&pound;) or zero for none" min="0" max="10000" step="1" value="" name="Broker_Fees" id="broker_fees" required="required" />
</span>

Валідація дещо розмита в браузерах, де IE / FF дозволяють коми і десяткові коми (якщо це 0,00), де як Chrome / Opera цього не потрібно і потрібні лише цифри.

Думаю, це ганьба, що обертач JQuery не буде працювати з введенням типу числа, але в документах явно зазначено, що цього не робити :-( і я спантеличений, чому віджет обертання чисел дозволяє вводити будь-який символ ascii?


1
JSFiddle вище - jsfiddle.net/yz9w9g3r Твик JSFiddle, але з будь-яким кроком та кращим позиціонуванням символу валюти - jsfiddle.net/yz9w9g3r/1
скреймер

Чудово, але слід зазначити, що це не надто міжнародне рішення. (Знову ж таки, браузери ще не розробили i18n для <input type="number">належного розроблення, або: stackoverflow.com/questions/15303940/… )
Майкл Шепер

0

У нас була та ж проблема з прийняттям грошових значень для євро, оскільки <input type="number" />не може відображати євро десятковий формат і формат коми.

Ми придумали рішення <input type="number" />для введення користувачем. Після того, як користувач введе значення, ми відформатуємо його та відобразимо у форматі євро, просто переключившись на<input type="text" /> . Це рішення Javascript, оскільки вам потрібна умова, щоб вирішити між режимами "користувач вводить текст" та "відображати користувачеві".

Ось посилання на Візуальне рішення нашого рішення: Вирішена проблема поля введення типу "Валюта"

Сподіваюся, це якимось чином допоможе!


0

Я натрапив на цю статтю, шукаючи подібну відповідь. Я прочитав приклад @vsync, використовуючи номер javascript Number.prototype.toLocaleString: і, здається, він добре працював. Єдина скарга у мене була на те, що якщо у вас більше одногоinput type="currency" сторінка на вашій сторінці, це лише змінить її перший екземпляр.

Як він згадує у своїх коментарях, він був розроблений лише як приклад для stackoverflow.

Однак приклад добре працював для мене, і хоча я маю невеликий досвід роботи з JS, я зрозумів, як його змінити, щоб він працював із кількома input type="currency"на сторінці, використовуючи document.querySelectorAllзамість document.querySelectorі додаючи цикл for.

Сподіваюся, це може бути корисним для когось іншого. (Основна частина коду - @vsync)

var currencyInput = document.querySelectorAll( 'input[type="currency"]' );

for ( var i = 0; i < currencyInput.length; i++ ) {

    var currency = 'GBP'
    onBlur( {
        target: currencyInput[ i ]
    } )

    currencyInput[ i ].addEventListener( 'focus', onFocus )
    currencyInput[ i ].addEventListener( 'blur', onBlur )

    function localStringToNumber( s ) {
        return Number( String( s ).replace( /[^0-9.-]+/g, "" ) )
    }

    function onFocus( e ) {
        var value = e.target.value;
        e.target.value = value ? localStringToNumber( value ) : ''
    }

    function onBlur( e ) {
        var value = e.target.value

        var options = {
            maximumFractionDigits: 2,
            currency: currency,
            style: "currency",
            currencyDisplay: "symbol"
        }

        e.target.value = ( value || value === 0 ) ?
            localStringToNumber( value ).toLocaleString( undefined, options ) :
            ''
    }
}

    var currencyInput = document.querySelectorAll( 'input[type="currency"]' );

    for ( var i = 0; i < currencyInput.length; i++ ) {

        var currency = 'GBP'
        onBlur( {
            target: currencyInput[ i ]
        } )

        currencyInput[ i ].addEventListener( 'focus', onFocus )
        currencyInput[ i ].addEventListener( 'blur', onBlur )

        function localStringToNumber( s ) {
            return Number( String( s ).replace( /[^0-9.-]+/g, "" ) )
        }

        function onFocus( e ) {
            var value = e.target.value;
            e.target.value = value ? localStringToNumber( value ) : ''
        }

        function onBlur( e ) {
            var value = e.target.value

            var options = {
                maximumFractionDigits: 2,
                currency: currency,
                style: "currency",
                currencyDisplay: "symbol"
            }

            e.target.value = ( value || value === 0 ) ?
                localStringToNumber( value ).toLocaleString( undefined, options ) :
                ''
        }
    }
.input_date {
    margin:1px 0px 50px 0px;
    font-family: 'Roboto', sans-serif;
    font-size: 18px;
    line-height: 1.5;
    color: #111;
    display: block;
    background: #ddd;
    height: 50px;
    border-radius: 5px;
    border: 2px solid #111111;
    padding: 0 20px 0 20px;
    width: 100px;
}
    <label for="cost_of_sale">Cost of Sale</label>
    <input class="input_date" type="currency" name="cost_of_sale" id="cost_of_sale" value="0.00">

    <label for="sales">Sales</label>
    <input class="input_date" type="currency" name="sales" id="sales" value="0.00">

     <label for="gm_pounds">GM Pounds</label>
     <input class="input_date" type="currency" name="gm_pounds" id="gm_pounds" value="0.00">


1
Це також дуже неефективний, вонг спосіб прив'язки подій до декількох елементів. Належним чином делегування подій відбувається вже близько десяти років.
vsync


-3

var currencyInput = document.querySelector('input[type="currency"]')
var currency = 'USD' // https://www.currency-iso.org/dam/downloads/lists/list_one.xml

 // format inital value
onBlur({target:currencyInput})

// bind event listeners
currencyInput.addEventListener('focus', onFocus)
currencyInput.addEventListener('blur', onBlur)


function localStringToNumber( s ){
  return Number(String(s).replace(/[^0-9.-]+/g,""))
}

function onFocus(e){
  var value = e.target.value;
  e.target.value = value ? localStringToNumber(value) : ''
}

function onBlur(e){
  var value = e.target.value

  var options = {
      maximumFractionDigits : 2,
      currency              : currency,
      style                 : "currency",
      currencyDisplay       : "symbol"
  }
  
  e.target.value = value 
    ? localStringToNumber(value).toLocaleString(undefined, options)
    : ''
}
input{
  padding: 10px;
  font: 20px Arial;
  width: 70%;
}
<input type='currency' value="123" placeholder='Type a number & click outside' />


будь ласка, додайте також кілька пояснень
Valentino Ru
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.