Buộc dấu chấm thập phân thay vì dấu phẩy trong đầu vào số HTML5 (phía máy khách)


86

Tôi đã thấy rằng một số trình duyệt bản địa hóa input type="number"ký hiệu của các số.

Vì vậy, bây giờ, trong các trường mà ứng dụng của tôi hiển thị tọa độ kinh độ và vĩ độ, tôi nhận được những thứ như "51,983", trong đó nó phải là "51,982559". Cách giải quyết của tôi là sử dụng input type="text"thay thế, nhưng tôi muốn sử dụng đầu vào số với hiển thị chính xác các số thập phân.

Có cách nào để buộc trình duyệt sử dụng dấu thập phân trong đầu vào số, bất kể cài đặt cục bộ phía máy khách không?

(Không cần phải nói rằng trong ứng dụng của tôi, tôi vẫn sửa lỗi này ở phía máy chủ, nhưng trong thiết lập của tôi, tôi cũng cần nó đúng ở phía máy khách (vì một số JavaScript)).

Cảm ơn trước.

CẬP NHẬT Hiện tại, khi kiểm tra Phiên bản Chrome 28.0.1500.71 m trên Windows 7, đầu vào số không chấp nhận các số thập phân được định dạng bằng dấu phẩy. Các đề xuất được đề xuất vớistepthuộc tính dường như không hoạt động.

http://jsfiddle.net/AsJsj/


Bạn đã tìm ra một giải pháp chưa? Tôi đang gặp sự cố gần như tương tự trên Chrome 11 trên Windows.
Kostas

Chưa có giải pháp. Đoán tốt nhất là để tránh điều này (và loại sử dụng input = "text") cho đến khi điều này được cố định ...
chocolata

3
Có vẻ như phụ thuộc vào ngôn ngữ của trình duyệt của bạn, trong chrome của tôi, tôi thấy dấu phẩy, trong chrome của đối tác tôi thấy dấu chấm.
fguillen


1
Như tôi cũng đã phát hiện ra gần đây, một số quốc gia sử dụng dấu phẩy thay vì 'dấu thập phân.
jbutler483 10/12/14

Câu trả lời:


26

Hiện tại, Firefox tôn trọng ngôn ngữ của phần tử HTML mà đầu vào nằm trong đó. Ví dụ, hãy thử trò chơi này trong Firefox:

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

Bạn sẽ thấy rằng các chữ số được viết bằng tiếng Ả Rập và dấu phẩy được sử dụng làm dấu phân tách phần thập phân, đây là trường hợp của tiếng Ả Rập. Điều này là do BODYthẻ được cung cấp thuộc tính lang="ar-EG".

Tiếp theo, hãy thử cái này:

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

Cái này được hiển thị với một dấu chấm làm dấu phân cách thập phân vì đầu vào được bao bọc trong một DIVthuộc tính nhất định lang="en-US".

Vì vậy, một giải pháp bạn có thể sử dụng là bọc các đầu vào số của bạn bằng một phần tử vùng chứa được thiết lập để sử dụng văn hóa sử dụng dấu chấm làm dấu phân tách thập phân.


3
Hấp dẫn! Đáng tiếc là nó chỉ dường như làm việc trong Firefox, không phải trong Chrome (47.0.2526.106)
luis.ap.uyen

Thậm chí không có trong Firefox, ở Pháp
Aubin

8
Firefox tôn trọng cài đặt ngôn ngữ của trang. Chrome áp dụng dấu phân tách thập phân của hệ điều hành hay trình duyệt? Edge áp dụng dấu thập phân, bất kể cài đặt ngôn ngữ của trang hoặc trình duyệt hoặc hệ điều hành. Thật là một mớ hỗn độn.
bbsimonbb

1
Bạn không cần phần tử wrapper. Bạn có thể đặt langthuộc tính trực tiếp trên phần tử đầu vào.
Jenny O'Reilly,

2
Các langthuộc tính thực sự thực hiện sự khác biệt đối với tôi, cảm ơn!
spaark

21

Với bước thuộc tính quy định đến độ chính xác của các số thập phân mà bạn muốn, và lang thuộc tính [mà được đặt thành một miền địa phương rằng các định dạng số thập phân với thời gian ], html5 số đầu vào của bạn sẽ chấp nhận số thập phân. ví dụ. để nhận các giá trị như 10,56; ý tôi là 2 số vị trí thập phân, hãy làm như sau:

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

Bạn có thể chỉ định thêm thuộc tính max cho giá trị tối đa cho phép.

Chỉnh sửa Thêmthuộc tính lang vào phần tử đầu vào có giá trị ngôn ngữ định dạng số thập phân bằng điểm thay vì dấu phẩy


28
Điều này vẫn không làm việc :-( giá trị địa phương Client-side luôn chuyển dấu thập phân trong một dấu phẩy thập phân, bất kể bước, hoặc thuộc tính giá trị :-(.
chocolata

12
Như tôi hiểu, câu hỏi không phải về việc có dấu phân cách thập phân. Câu hỏi là về việc có '.' thay vì ',' khi ngôn ngữ của khách hàng thích ','.
Emanuele Paolini

bất kể bạn sử dụng dấu phân tách thập phân nào trong thuộc tính bước - trình duyệt vẫn sẽ bản địa hóa nó. Đó là, với ví dụ của bạn được đưa ra - ở hầu hết các quốc gia Châu Âu, con số được hiển thị sẽ là 10,56
khartvin

1
Tôi quay lại và đọc lại câu hỏi 5 năm sau và tự hỏi tại sao tôi lại đưa ra câu trả lời ở trên. Xem các chỉnh sửa, xin vui lòng
Peter

Nó cũng sẽ không hoạt động nếu dữ liệu đang được lưu bằng ajax.
somsgod


5

Sử dụng thuộc tính lang cho đầu vào. Ngôn ngữ trên ứng dụng web của tôi fr_FR, lang = "en_EN" trên số đầu vào và tôi có thể vô tư sử dụng dấu phẩy hoặc dấu chấm. Firefox luôn hiển thị dấu chấm, Chrome hiển thị dấu phẩy. Nhưng cả hai separtor đều hợp lệ.


4

Đáng buồn thay, mức độ phù hợp của trường đầu vào này trong các trình duyệt hiện đại là rất thấp:

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

Do đó, tôi khuyên bạn nên mong đợi dự phòng và dựa vào đầu vào [type = text] được lập trình nặng để thực hiện công việc, cho đến khi trường được chấp nhận chung.

Cho đến nay, chỉ có Chrome, Safari và Opera là có triển khai gọn gàng, còn tất cả các trình duyệt khác đều gặp lỗi. Một số trong số chúng dường như không hỗ trợ số thập phân (như BB10)!


Sử dụng một thư viện như number.js có thể giúp giải quyết các vấn đề cố hữu khi có nhiều ngôn ngữ trên hành tinh này.
pintxo

3

Tôi không biết liệu điều này có hữu ích không nhưng tôi đã vấp phải ở đây khi tìm kiếm cùng một vấn đề này, chỉ từ quan điểm đầu vào (tức là tôi nhận thấy rằng tôi <input type="number" />chấp nhận cả dấu phẩy và dấu chấm khi nhập giá trị, nhưng chỉ có bị ràng buộc với mô hình anglejs mà tôi đã gán cho đầu vào). Vì vậy, tôi đã giải quyết bằng cách ghi nhanh chỉ thị nhanh này:

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

Sau đó, trên html của tôi, chỉ cần: <input type="number" ng-model="foo" replace-comma />sẽ thay thế dấu phẩy bằng dấu chấm ngay lập tức để ngăn người dùng nhập các số không hợp lệ (theo quan điểm javascript, không phải từ địa phương!). Chúc mừng.


Xin chào Andrea, có cách nào để thực hiện việc này mà không có Angular JS không? Với jQuery chẳng hạn?
chocolata

5
Chắc chắn, tôi cho rằng bạn có thể viết, trên một cơ sở cho mỗi số đầu vào, một cái gì đó giống như $("input[type=number]").on("keydown", function(e) { if(e.keyCode === 188) { this.value += "."; e.preventDefault(); }});(khi trang của bạn đã được nạp đầy đủ cùng với tất cả các đầu vào số)
Andrea Aloi

2
Đoạn mã này không hoạt động trên chrome (được thử nghiệm với v60). Khi nhập 888,, thiết lập thuộc valuetính sẽ đưa ra một cảnh báo cho biết đó 888.không phải là số hợp lệ (regexp yêu cầu ít nhất một số sau dấu chấm) và bỏ trống trường. Gõ một dấu chấm công trình tuy nhiên, có lẽ vì đầu vào xem xét giá trị của nó “cơ bản dở dang” và chờ đợi để biết thêm chữ số được gõ
svvac

3

Tôi đã tìm thấy một bài viết trên blog có vẻ giải thích điều gì đó liên quan:
kiểu nhập HTML5 = số và số thập phân / số nổi trong Chrome

Tóm tắt:

  • những stepgiúp để xác định lĩnh vực giá trị hợp lệ
  • mặc định step1
  • do đó miền mặc định là các số nguyên (giữa minmax, bao gồm, nếu đã cho)

Tôi sẽ cho rằng điều đó đang mâu thuẫn với sự mơ hồ của việc sử dụng dấu phẩy làm dấu phân cách hàng nghìn so với dấu phẩy làm dấu thập phân và của bạn 51,983thực sự là năm mươi mốt nghìn, chín trăm lẻ ba được phân tích cú pháp kỳ lạ.

Rõ ràng bạn có thể sử dụng step="any"để mở rộng miền tới tất cả các số hữu tỉ trong phạm vi, tuy nhiên tôi chưa thử tự mình làm điều đó. Đối với vĩ độ và kinh độ, tôi đã sử dụng thành công:

<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">

Nó có thể không đẹp, nhưng nó hoạt động.


Trong trường hợp đó, đó là một điều tốt khi tôi viết một bản tóm tắt và sau đó ngoại suy, hả?
Matty K

0

Theo như tôi hiểu thì HTML5 input type="numberluôn trả về input.valuedưới dạng string.

Rõ ràng, input.valueAsNumbertrả về giá trị hiện tại dưới dạng số dấu phẩy động. Bạn có thể sử dụng điều này để trả về một giá trị bạn muốn.

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


Cảm ơn, điều đó có thể hữu ích!
sôcôla vào

Điều thú vị là nó input.valuethực sự trả về một số chính tắc với một điểm mặc dù nó hiển thị dưới dạng hôn mê. Thật tệ khi sống ở một quốc gia thuộc thế giới thứ ba châu Âu ...
Klesun

0

Bạn đã cân nhắc sử dụng Javascript cho việc này chưa?

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


Trên chrome với đầu vào [type = number] không hoạt động .. dấu phẩy luôn hiển thị.
Dự kiến

0

một tùy chọn là javascript parseFloat()... không bao giờ phân tích cú pháp a " text chain" --> 12.3456với trỏ tới một int ... 123456(int remove the point) phân tích cú pháp chuỗi văn bản thành FLOAT ...

để gửi coords này đến một máy chủ, hãy thực hiện việc này gửi một chuỗi văn bản. HTTPchỉ gửiTEXT

trong ứng dụng khách, tránh phân tích cú pháp các coords đầu vào bằng " int", hãy làm việc với chuỗi văn bản

nếu bạn in các dây trong html bằng php hoặc tương tự ... float thành văn bản và in trong html


0

1) 51,983 là số kiểu chuỗi không chấp nhận dấu phẩy

vì vậy bạn nên đặt nó là văn bản

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

thay thế bằng .

và thay đổi thuộc tính loại thành số

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

Kiểm tra http://jsfiddle.net/ydf3kxgu/

Hi vọng nó có thể giải quyết vấn đề của bạn


Trên thực tế, thiết lập loại văn bản gần như là giải pháp duy nhất để làm cho điểm lưu trú. Kết hợp với việc pattern="\d+\.\d{2}"tôi thậm chí gọi UX như vậy là chấp nhận được ... Tuy nhiên, tôi sẽ bỏ phần jquery ...
Klesun

0

sử dụng mẫu

<input 
       type="number" 
       name="price"
       pattern="[0-9]+([\.,][0-9]+)?" 
       step="0.01"
       title="This should be a number with up to 2 decimal places."
>

chúc may mắn


1
Xin chào, bạn vừa thử nghiệm nó trong Chrome 62.0.3202.94 trên Windows 10. Nó không hoạt động. Khi sử dụng các nút xoay, đầu vào sẽ chuyển thành dấu phẩy thay vì điểm (xem xét cài đặt ngôn ngữ của Bỉ). Dù sao đi nữa cũng xin cám ơn.
chocolata

0

Tôi đã viết một đoạn mã tùy chỉnh để thực hiện việc này

Nếu bạn muốn thay thế ,bằng ., hãy loại bỏ hoàn toàn các hàm translate_decimals .

var input = document.querySelector('input[role="custom-number"]');
var bincr = document.querySelector('button[role="increment"]');
var bdecr = document.querySelector('button[role="decrement"]');

function translate_decimals(side = 0)
{
	input.value = (side == ',' ? input.value.replace('.',',') : input.value.replace(',','.'));
}
translate_decimals(',');

bincr.addEventListener('click', ()=>{
	if (input.hasAttribute('max'))
	{
		if (input.value.substr(0,input.getAttribute('max').length) == input.getAttribute('max').substr(0,input.getAttribute('max').length))
		{
			return;
		}
		else
		{
			translate_decimals('.');
			let temp = input.value;
			input.value = "";
			input.value = (input.hasAttribute('step') ? (parseFloat(temp) + parseFloat(input.getAttribute('step'))) : temp++);
			translate_decimals(',');
		}
	}
});

bdecr.addEventListener('click', ()=>{
	if (input.hasAttribute('min'))
	{
		if (input.value.substr(0,input.getAttribute('min').length) == input.getAttribute('min').substr(0,input.getAttribute('min').length))
		{
			return;
		}
		else
		{
			translate_decimals('.');
			input.value = (input.hasAttribute('step') ? (input.value - input.getAttribute('step')) : input.value--);
			translate_decimals(',');
		}
	}
});
/* styling increment & decrement buttons */
button[role="increment"],
button[role="decrement"] {
	width:32px;
}
<input type="text" role="custom-number" step="0.01" min="0" max="0" lang="en" value="1.99">
<button role="increment">+</button>
<button role="decrement">-</button>


0

Tôi cần đảm bảo các giá trị vẫn có thể được nhập bằng dấu phẩy thay vì dấu chấm dưới dạng dấu phân tách thập phân. Đây dường như là một vấn đề thời đại. Thông tin cơ bản có thể được tìm thấy theo các liên kết sau:

Cuối cùng tôi đã giải quyết nó bằng một chút jQuery. Thay dấu phẩy bằng dấu chấm onChange. Điều này dường như đang hoạt động tốt cho đến nay trên Firefox, Chrome và Safari mới nhất.

$('input[type=number]').each(function () {

  $(this).change(function () {

    var $replace = $(this).val().toString().replace(/,/g, '.');

    $(this).val($replace);

  })

});

-1

Thuộc tính bước HTML

<input type="number" name="points" step="3">

Ví dụ: nếu bước = "3", các số hợp pháp có thể là -3, 0, 3, 6, v.v.

 

Mẹo: Thuộc tính step có thể được sử dụng cùng với các thuộc tính max và min để tạo ra một loạt các giá trị pháp lý.

Lưu ý: Thuộc tính step hoạt động với các loại đầu vào sau: số, phạm vi, ngày, giờ, ngày giờ-cục bộ, tháng, giờ và tuần.


Nhưng ... nhưng câu hỏi là về số thập phân, step="3"sẽ giới hạn đầu vào chỉ là số nguyên. Và thiết lập step="0.01"vẫn cho thấy nó như một cơn mê; c
Klesun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.