html5 input for money/currency

前端 未结 7 1419
伪装坚强ぢ
伪装坚强ぢ 2020-12-08 01:55

I seem unable to work out what to use for accepting monetary values on a form.

I have tried...



        
相关标签:
7条回答
  • 2020-12-08 02:01

    More easy and beautiful if you has vue.js v-money-spinner :)

    0 讨论(0)
  • 2020-12-08 02:02

    Using javascript's Number.prototype.toLocaleString:

    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' />

    0 讨论(0)
  • 2020-12-08 02:06

    Enabling Fractions/Cents/Decimals for Number Input

    In order to allow fractions (cents) on an HTML5 number input, you need to specify the "step" attribute to = "any":

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

    This will specifically keep Chrome from displaying an error when a decimal/fractional currency is entered into the input. Mozilla, IE, etc... don't error out if you forget to specify step="any". W3C spec states that step="any" should, indeed, be needed to allow for decimals. So, you should definitely use it. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number#step

    Note that if you want the up/down buttons to do a specific granularity, then you must specify a numeric step such as ".01".

    Also, the number input is now pretty widely supported (>90% of users).


    What Input Options are there for Money/Currency?

    The title of the question has since changed and takes on a slightly different meaning. One could use both number or text input in order to accept money/decimals.

    For an input field for currency/money, it is recommended to use input type of number and specify appropriate attributes as outlined above. As of 2020, there is not a W3C spec for an actual input type of currency or money.

    Main reason being it automatically coerces the users into entering a valid standard currency format and disallows any alphanumeric text. With that said, you could certainly use the regular text input and do some post processing to only grab the numeric/decimal value (there should be server side validation on this at some point as well).

    The OP detailed a requirement of currency symbols and commas. If you want fancier logic/formatting like that, (as of 2020) you'll need to create custom JS logic for a text input or find a plugin.

    0 讨论(0)
  • 2020-12-08 02:07

    We had the same problem for accepting monetary values for Euro, since <input type="number" /> can't display Euro decimal and comma format.

    We came up with a solution, to use <input type="number" /> for user input. After user types in the value, we format it and display as a Euro format by just switching to <input type="text" />. This is a Javascript solution though, cuz you need a condition to decide between "user is typing" and "display to user" modes.

    Here the link with Visuals to our solution: Input field type "Currency" problem solved

    Hope this helps in some way!

    0 讨论(0)
  • 2020-12-08 02:19

    Try using step="0.01", then it will step by a penny each time.

    eg:

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

    0 讨论(0)
  • 2020-12-08 02:21

    Well in the end I had to compromise by implementing a HTML5/CSS solution, forgoing increment buttons in IE (they're a bit broke in FF anyway!), but gaining number validation that the JQuery spinner doesn't provide. Though I have had to go with a step of whole numbers.

    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>

    The validation is a bit flaky across browsers, where IE/FF allow commas and decimal places (as long as it's .00), where as Chrome/Opera don't and want just numbers.

    I guess it's a shame that the JQuery spinner won't work with a number type input, but the docs explicitly state not to do that :-( and I'm puzzled as to why a number spinner widget allows input of any ascii char?

    0 讨论(0)
提交回复
热议问题