ChatGPT解决这个技术问题 Extra ChatGPT

Is there a float input type in HTML5?

According to html5.org, the "number" input type's "value attribute, if specified and not empty, must have a value that is a valid floating point number."

Yet it is simply (in the latest version of Chrome, anyway), an "updown" control with integers, not floats:

Is there a floating point input element native to HTML5, or a way to make the number input type work with floats, not ints? Or must I resort to a jQuery UI plugin?


A
Andy

The number type has a step value controlling which numbers are valid (along with max and min), which defaults to 1. This value is also used by implementations for the stepper buttons (i.e. pressing up increases by step).

Simply change this value to whatever is appropriate. For money, two decimal places are probably expected:

<label for="totalAmt">Total Amount</label>
<input type="number" step="0.01" id="totalAmt">

(I'd also set min=0 if it can only be positive)

If you'd prefer to allow any number of decimal places, you can use step="any" (though for currencies, I'd recommend sticking to 0.01). In Chrome & Firefox, the stepper buttons will increment / decrement by 1 when using any. (thanks to Michal Stefanow's answer for pointing out any, and see the relevant spec here)

Here's a playground showing how various steps affect various input types:

Step 1 (default)
Step 0.01
Step any
Step 20
Step 60 (default)
Step 1
Step any
Step 0.001
Step 3600 (1 hour)
Step 86400 (1 day)
Step 70 (1 min, 10 sec)

As usual, I'll add a quick note: remember that client-side validation is just a convenience to the user. You must also validate on the server-side!


To respond to @Elfayer's edit: quotes are optional in HTML unless you want to use certain characters. Personally I prefer to omit them where possible for better readability.
This is not working correctly in latest versions of Firefox: bugzilla.mozilla.org/show_bug.cgi?id=1003896
@Dave: Yes, technically, omitting quotes is fine, bit it introduces a host of potential issues. First, a subset of characters are handled differently in different browsers and versions thereof. If you choose not to use quotes, then you must be constantly cognizant of which characters will cause problems in each browser and version. That's a lot of mental power devoted to something that's not necessary to worry about at all if you just use quotes. (cont.)
Second, while you may be fine with worrying about the rules of which characters are fine and which aren't, the developer that comes behind you probably won't be. That then requires that they either endure the arduous task of adding quotes to all the attributes you left unquoted or worse, simply introduce problems into the code which they might not even understand the source of. Finally, since sometimes you will have to use quotes, the code then looks inconsistent with some attributes quoted and others not.
@relipse see here: stackoverflow.com/q/3790935/1180785 but be sure to read the comments for each answer; it looks like all options have drawbacks, and you'll need to see what fits your particular needs.
M
Mars Robertson

Via: http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/

But what if you want all the numbers to be valid, integers and decimals alike? In this case, set step to “any”

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

Works for me in Chrome, not tested in other browsers.


Chrome => Works perfect Safari => Will not show error message, and if not number it will not pass to server IE => Version less than 10 not, works
Unfortunately in chrome it allows you to enter multiple decimal points, for instance an IP address.
@Andy newer versions of chrome this is fixed. This should be the acepted answer nowadays.
T
Tim Cooper

You can use:

<input type="number" step="any" min="0" max="100" value="22.33">

S
SanChamp

You can use the step attribute to the input type number:

<input type="number" id="totalAmt" step="0.1"></input>

step="any" will allow any decimal.
step="1" will allow no decimal.
step="0.5" will allow 0.5; 1; 1.5; ...
step="0.1" will allow 0.1; 0.2; 0.3; 0.4; ...


C
Community

Based on this answer

<input type="text" id="sno" placeholder="Only float with dot !"   
   onkeypress="return (event.charCode >= 48 && event.charCode <= 57) ||  
   event.charCode == 46 || event.charCode == 0 ">

Meaning :

Char code :

48-57 equal to 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

0 is Backspace(otherwise need refresh page on Firefox)

46 is dot

&& is AND , || is OR operator.

if you try float with comma :

<input type="text" id="sno" placeholder="Only float with comma !"   
     onkeypress="return (event.charCode >= 48 && event.charCode <= 57) ||  
     event.charCode == 44 || event.charCode == 0 ">

Supported Chromium and Firefox (Linux X64)(other browsers I does not exist.)


Feels backward. How about copy & paste in the field?
Hack for input, hack for copy & paste, hack on top of a hack = bad practice. We have 2017
Where you read any password inputs ? Who care which method using after a session ? No, we have 1856 ! Try another user !
Sounds too complicated, but, reasoning on this method versus other mentioned not provided
s
sadalsuud

I do so

 <input id="relacionac" name="relacionac" type="number" min="0.4" max="0.7" placeholder="0,40-0,70" class="form-control input-md" step="0.01">

then, I define min in 0.4 and max in 0.7 with step 0.01: 0.4, 0.41, 0,42 ... 0.7


r
resJnr

Step 1 (default)
Step 0.01
Step any
Step 20
Step 60 (default)
Step 1
Step any
Step 0.001
Step 3600 (1 hour)
Step 86400 (1 day)
Step 70 (1 min, 10 sec)


Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
A
Avatar

I have started using inputmode="decimal" which works flawlessly with smartphones:

<input type="text" inputmode="decimal" value="1.5">

Note that we have to use type="text" instead of number. However, on desktop it still allows letters as values.

For desktop you could use:

<input type="number" inputmode="decimal">

which allows 0-9 and . as input and only numbers.

Note that some countries use , as decimal dividor which is activated as default on the NumPad. Thus entering a float number by Numpad would not work as the input field expects a . (in Chrome). That's why you should use type="text" if you have international users on your website.

You can try this on desktop (also with Numpad) and your phone:

Input with type text:


Input with type number:

Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode


A
Alexie01

yes this is the correct answer:

step="any"

This is more efficient. Trust me.

document.getElementById('form1').addEventListener('submit', function(e){ e.preventDefault(); alert("Your nnumber is: "+document.getElementById('n1').value) alert("This works no ? :) please upvote") })


D
DreamTeK

I just had the same problem, and I could fix it by just putting a comma and not a period/full stop in the number because of French localization.

So it works with:

2 is OK

2,5 is OK

2.5 is KO (The number is considered "illegal" and you receive empty value).


add lang="en" to input or any parent and it will start using english number style
I
Irfan wani
<input type="number" step="any">

This worked for me and i think is the easiest way to make the input field accept any decimal number irrespective of how long the decimal part is. Step attribute actually shows the input field how many decimal points should be accepted. E.g, step="0.01" will accept only two decimal points.


E
Ernst Plesiutschnig

Using React on my IPad, type="number" does not work perfectly for me. For my floating point numbers in the range between 99.99999 - .00000 I use the regular expression (^[0-9]{0,2}$)|(^[0-9]{0,2}\.[0-9]{0,5}$). The first group (...) is true for all positive two digit numbers without the floating point (e.g. 23), | or e.g. .12345 for the second group (...). You can adopt it for any positive floating point number by simply changing the range {0,2} or {0,5} respectively.

<input
  className="center-align"
  type="text"
  pattern="(^[0-9]{0,2}$)|(^[0-9]{0,2}\.[0-9]{0,5}$)"
  step="any"
  maxlength="7"
  validate="true"
/>

G
Guenter

https://i.stack.imgur.com/ABKzK.png


M
MD SHAYON

If any of the methods doesn't work you can use parse float.

const totalAmt = document.getElementById("totalAmt"); totalAmt.addEventListener("change", (e)=>{ // e.preventDefault(e); const result = parseFloat(e.target.value); console.log(result) });