HTML5 sayı girişinde virgül yerine ondalık basamağı zorla (istemci tarafı)


92

Bazı tarayıcıların input type="number"sayıların gösterimini yerelleştirdiğini gördüm .

Şimdi, uygulamamın enlem ve boylam koordinatlarını görüntülediği alanlarda, "51,983" gibi "51,982559" olması gereken şeyler alıyorum. Çözümüm input type="text"bunun yerine kullanmaktır , ancak sayı girişini ondalık sayıların doğru görüntülenmesiyle kullanmak istiyorum.

İstemci tarafındaki yerel ayarlardan bağımsız olarak tarayıcıları sayı girişinde ondalık nokta kullanmaya zorlamanın bir yolu var mı ?

(Uygulamamda bunu sunucu tarafında yine de düzelttiğimi söylemeye gerek yok, ancak kurulumumda istemci tarafında da doğru olmasına ihtiyacım var (bazı JavaScript nedeniyle).

Şimdiden teşekkürler.

GÜNCELLEME Şu an itibariyle, Windows 7'de Chrome Sürüm 28.0.1500.71 m kontrol edildiğinde, sayı girişi virgülle biçimlendirilmiş ondalık sayıları kabul etmiyor. Bustepniteliğesahip önerilen önerilerişe yaramıyor gibi görünüyor.

http://jsfiddle.net/AsJsj/


Henüz bir çözüm buldunuz mu? Windows'ta Chrome 11'de neredeyse aynı sorunu yaşıyorum.
Kostas

Henüz çözüm yok. En iyi tahmin, bundan kaçınmaktır (ve bu düzeltilene kadar input type = "text" kullanın) ...
chocolata

3
Görünüşe göre tarayıcınızın yerel ayarlarına bağlı, kromumda virgül görüyorum, partnerimin kromunda nokta görüyorum.
fguillen


1
Yakın zamanda öğrendiğim gibi, bazı ülkeler 'ondalık nokta yerine virgül kullanıyor.
jbutler483

Yanıtlar:


28

Şu anda Firefox, girdinin bulunduğu HTML öğesinin dilini kabul ediyor. Örneğin, Firefox'ta şu keman yapmayı deneyin:

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

Sayıların Arapça olduğunu ve ondalık ayırıcı olarak virgülün Arapçada olduğu gibi kullanıldığını göreceksiniz. Bunun nedeni, BODYetikete öznitelik verilmesidir lang="ar-EG".

Sonra, şunu deneyin:

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

Bu, ondalık ayırıcı olarak bir nokta ile görüntülenir, çünkü girdi DIVbelirli bir özniteliğe sarılmıştır.lang="en-US" .

Dolayısıyla, başvurabileceğiniz bir çözüm, sayısal girdilerinizi ondalık ayırıcı olarak noktaları kullanan bir kültürü kullanmak üzere ayarlanmış bir kap öğesiyle sarmalamaktır.


3
İlginç! Maalesef Chrome'da değil, yalnızca Firefox'ta çalışıyor gibi görünüyor (47.0.2526.106)
luis.ap.uyen

Firefox'ta olmasa bile, Fransa'da
Aubin

8
Firefox, sayfanın dil ayarına saygı duyar. Chrome, işletim sisteminin veya tarayıcının ondalık ayırıcısını kullanıyor mu? Edge, sayfanın veya tarayıcının veya işletim sisteminin dil ayarlarından bağımsız olarak ondalık noktayı uygular. Ne dağınıklık.
bbsimonbb

1
Sarmalayıcı öğesine ihtiyacınız yok. langÖzniteliği doğrudan giriş öğesinde ayarlayabilirsiniz .
Jenny O'Reilly

2
langNitelik aslında benim için teşekkürler fark yarattı!
spaark

23

İle adım İstediğiniz ondalık hassasiyeti bir özelliğine de ve lang [ile formatları ondalık sayılar o bir yerel olarak ayarlandığında özniteliği dönemi , senin html5 sayısal giriş ondalık sayılar kabul eder]. Örneğin. 10.56 gibi değerler almak için; 2 ondalık basamak sayısını kastediyorum, şunu yapın:

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

İzin verilen maksimum değer için maksimum özniteliği de belirtebilirsiniz .

Düzenle Ondalık sayıları virgül yerine nokta ile biçimlendiren bir yerel değer ile giriş öğesine bir lang niteliğiekleyin


28
Bu hala çalışmıyor :-( İstemci tarafındaki yerel değerler, adımdan veya değer özniteliğinden bağımsız olarak her zaman ondalık noktayı ondalık virgülle dönüştürür. :-(
chocolata

12
Anladığım kadarıyla soru ondalık ayırıcı kullanmakla ilgili değil. Soru 'sahip olmakla ilgili.' Müşterinin yerel ayarı ',' tercih ettiğinde ',' yerine.
Emanuele Paolini

step özniteliğinde hangi ondalık ayırıcıyı kullanırsanız kullanın - tarayıcı onu yine de yerelleştirecektir. Yani, verdiğiniz örnekle
khartvin

1
5 yıl sonra geri dönüp soruyu tekrar okudum ve yukarıdaki cevabı neden verdiğimi merak ettim. Düzenlemeye bakın lütfen
Peter

Veriler ajax kullanılarak kaydediliyorsa da çalışmayacaktır.
somsgod


7

Girişte lang niteliğini kullanın. Web uygulamamdaki yerel ayar fr_FR, lang = "en_EN" giriş numarasında ve kayıtsız olarak virgül veya nokta kullanabilirim. Firefox her zaman bir nokta, Chrome ise virgül gösterir. Ancak her iki ayırıcı da geçerlidir.


6

Ne yazık ki, modern tarayıcılarda bu giriş alanının kapsamı çok düşük:

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

Bu nedenle, alan genel olarak kabul edilene kadar, geri dönüşü beklemenizi ve işi yapmak için programatik olarak yüklü bir girdiye [tür = metin] güvenmenizi öneririm.

Şimdiye kadar sadece Chrome, Safari ve Opera'nın düzgün bir uygulaması var, ancak diğer tüm tarayıcılar hatalı. Bazıları ondalık sayıları desteklemiyor gibi görünüyor (BB10 gibi)!


Number.js gibi bir kitaplık kullanmak , bu gezegende birden fazla dile sahip olmanın doğasında olan sorunlara yardımcı olabilir.
pintxo

5

Bunun yardımcı olup olmadığını bilmiyorum ama aynı sorunu ararken burada tökezledim, yalnızca giriş açısından bakıldığında (yani <input type="number" />değeri yazarken hem virgül hem de noktayı kabul ettiğimi fark ettim , ancak yalnızca ikincisi girdiye atadığım angularjs modeline bağlı olarak). Ben de bu hızlı yönergeyi not ederek çözdüm:

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

Daha sonra, html'mde basitçe: <input type="number" ng-model="foo" replace-comma />kullanıcıların geçersiz sayılar (javascript açısından değil, yerel olarak değil!) Girmesini önlemek için virgülleri anında noktalarla değiştirecek. Şerefe.


Merhaba Andrea, bunu Angular JS olmadan yapmanın bir yolu var mı? Örneğin jQuery ile?
chocolata

5
Elbette, sayı başına girdi esasına göre $("input[type=number]").on("keydown", function(e) { if(e.keyCode === 188) { this.value += "."; e.preventDefault(); }});(sayfanız tüm sayı girişleriyle birlikte tam olarak yüklendiğinde)
Andrea Aloi

2
Bu snippet, Chrome'da çalışmıyor (v60 ile test edildi). Yazarken 888,, valueözelliğin ayarlanması, 888.geçerli bir sayı olmadığını belirten bir uyarı atar (regexp, noktadan sonra en az bir sayı gerektirir) ve alanı boş bırakır. Bir nokta yazmak işe yarıyor, muhtemelen girişin değerini "işlemde" olarak kabul etmesi ve daha fazla basamağın yazılmasını
beklemesi

5

İlgili bir şeyi açıklayan bir blog makalesi buldum:
HTML5 input type = sayı ve ondalık sayılar / Chrome'da kayan sayılar

Özetle:

  • stepGeçerli değerlerin etki alanını tanımlamak için yardımcı olur
  • varsayılan stepolduğunu1
  • bu nedenle varsayılan alan tamsayılardır ( verilmişse minve arasında max, dahil)

Binlik ayırıcı olarak virgül ve ondalık nokta olarak virgül kullanmanın belirsizliği ile karıştırıldığını varsayabilirim. 51,983 aslında garip bir şekilde ayrıştırılmış elli bir bin dokuz yüz sekiz üç.

Görünüşe göre step="any"etki alanını aralıktaki tüm rasyonel sayılara genişletmek için kullanabilirsiniz , ancak ben kendim denemedim. Enlem ve boylam için başarıyla kullandım:

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

Güzel olmayabilir ama işe yarıyor.


Bu durumda iyi bir şey bir özet yazıp sonra tahmin etmişim, değil mi?
Matty K

1

Anladığım kadarıyla, HTML5 input type="numberher zaman input.valuebir string.

Görünüşe göre, input.valueAsNumbergeçerli değeri bir kayan nokta sayısı olarak döndürür. İstediğiniz bir değeri döndürmek için bunu kullanabilirsiniz.

Bkz. Http://diveintohtml5.info/forms.html#type-number


Teşekkürler, bu yararlı olabilir!
çikolata

İşin eğlenceli yanı, input.valuekoma olarak görünmesine rağmen aslında bir kanonik sayıyı bir noktayla döndürmesidir. Avrupalı ​​bir üçüncü dünya ülkesinde yaşamak berbat ...
Klesun

0

Bunun için Javascript kullanmayı düşündünüz mü?

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


Girişli kromda [tür = sayı] çalışmıyor .. virgül her zaman gösterilir.
2014

0

seçeneklerden biri javascript parseFloat()... asla a "öğesini text chain" --> 12.3456int işaretiyle ayrıştırma ...123456 (int noktayı kaldır) bir metin zincirini bir FLOAT'a ayrıştırma ...

bu koordinatları bir sunucuya göndermek için bunu bir metin zinciri göndererek yapın. HTTPsadece gönderirTEXT

istemcide giriş koordinatlarını "int " , metin dizeleriyle çalışın

html'deki kordonları php veya benzeri ile yazdırırsanız ... float metne ve html'de yazdırın


0

1) 51.983 bir dize türü numarası virgül kabul etmez

bu yüzden metin olarak ayarlamalısın

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

ile değiştirin .

ve tür özniteliğini sayı olarak değiştirin

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

Http://jsfiddle.net/ydf3kxgu/ adresine göz atın

Umarız bu sorununuzu çözer


Aslında, yazıyı metin olarak ayarlamak, nokta kalmasını sağlamak için neredeyse tek çözümdür. Bununla bağlantılı olarak, pattern="\d+\.\d{2}"böyle bir
UX'i

0

kalıbı kullan

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

iyi şanslar


1
Merhaba, Windows 10'da Chrome 62.0.3202.94'te test ettim. Çalışmıyor. Değer değiştirici düğmelerini kullanırken, giriş nokta yerine virgül haline döner (Belçika yerel ayarları dikkate alındığında). Yine de teşekkürler.
chocolata

0

Bunu yapmak için özel bir kod parçası yazdım

Eğer değiştirmek istiyorsanız ,ile ., remove translate_decimals tamamen işlevlerini.

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

Değerlerin ondalık ayırıcı olarak nokta yerine virgülle girilebilmesini sağlamam gerekiyordu. Bu çok eski bir sorun gibi görünüyor. Arka plan bilgisi şu bağlantılarda bulunabilir:

Sonunda biraz jQuery ile çözdüm. Virgüllerin Değiştirilen noktalarla değiştirilmesi. Bu, en son Firefox, Chrome ve Safari'de şu ana kadar iyi çalışıyor gibi görünüyor.

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

  $(this).change(function () {

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

    $(this).val($replace);

  })

});

-1

HTML adım Özelliği

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

Örnek: adım = "3" ise, yasal sayılar -3, 0, 3, 6 vb. Olabilir.

 

İpucu: Step özelliği, bir dizi yasal değer oluşturmak için max ve min özellikleriyle birlikte kullanılabilir.

Not: Adım özelliği şu giriş türleriyle çalışır: sayı, aralık, tarih, tarih saat, tarih saat-yerel, ay, saat ve hafta.


Ama ... ama soru ondalık sayılarla ilgili, step="3"girdiyi yalnızca tam sayılarla sınırlar. Ve ayar step="0.01"hala onu koma olarak gösteriyor; c
Klesun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.