主にモバイルブラウザ向けのWebアプリを構築しています。数値型の入力フィールドを使用しているため、(ほとんどの)モバイルブラウザーはユーザーエクスペリエンスを向上させるために数値キーボードのみを呼び出します。このWebアプリは主に、小数点ではなく小数点がコンマである地域で使用されるため、両方の小数点を処理する必要があります。
この混乱全体をドットとコンマでカバーする方法は?
私の発見:
デスクトップChrome
$("#my_input").val();
は「455」を返しますデスクトップFirefox
$("#my_input").val();
は「4,55」を返しますAndroidブラウザ
Windows Phone 8
$("#my_input").val();
は「4,55」を返しますユーザーがコンマまたはドットを小数点記号として使用し、HTMLの入力タイプを数値として保持し、ユーザーエクスペリエンスを向上させるこのような状況での「ベストプラクティス」とは何ですか。
キーイベントをバインドして、コンマを「オンザフライ」でドットに変換できますか、それは数値入力で動作しますか?
Currenlty私は解決策を持っていません、入力値からfloat型の値を(文字列または数値として)取得する方法は、タイプが数値に設定されています。エンドユーザーが「4,55」と入力すると、Chromeは常に「455」を返し、Firefoxは「4,55」を返しますが、これは問題ありません。
また、Android(テスト済み4.2エミュレーター)では、「4,55」を入力フィールドに入力し、フォーカスを他の場所に変更すると、入力した数値が「4」に切り捨てられることは非常に面倒です。
上記の答えに欠けているのは、step
属性に別の値を指定する必要があることだと思います。これには、1
のデフォルト値があります。入力の検証アルゴリズムで浮動小数点値を許可する場合は、それに応じてステップを指定します。
たとえば、ドルの金額が必要だったため、次のような手順を指定しました。
<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.">
JQueryを使用して値を取得しても問題はありませんが、DOM APIを直接使用して要素のvalidity.valid
プロパティを取得すると便利です。
小数点についても同様の問題がありましたが、問題があることに気付いた理由は、Twitter Bootstrapが無効な値を持つ数値入力に追加するスタイリングのためでした。
以下は、step
属性を追加することで機能することを示し、現在の値が有効かどうかをテストするフィドルです。
TL; DR:デフォルトは1
であるため、step
属性を浮動小数点値に設定します。
NOTE:コンマは検証されませんが、OSの言語/地域を設定すると小数点としてカンマを使用するどこかに設定すると、動作します。 *注の注*:OS言語/キーボード設定の場合はそうではありませんでした* Ubuntu/Gnome 14.04のドイツ語*
W3.orgによると、 数値入力 のvalue属性は 浮動小数点数 として定義されています。浮動小数点数の構文は、小数点を小数点としてのみ受け入れるようです。
あなたに役立つかもしれないいくつかのオプションを以下にリストしました:
pattern属性を使用すると、HTML5互換の方法で正規表現を使用して許可される形式を指定できます。ここでは、パターンが失敗した場合にカンマ文字を許可することと、有用なフィードバックメッセージを指定できます。
<input type="number" pattern="[0-9]+([,\.][0-9]+)?" name="my-num"
title="The number input must start with a number and use either comma or a dot as a decimal character."/>
注:クロスブラウザのサポートは大きく異なります。完全、部分的、または存在しない場合があります。
単純なコールバックを、たとえばonchange(および/またはblur)イベントにバインドして、コンマを置き換えることができますまたはすべてをまとめて検証します。
第三に、そのフィールドのブラウザ検証をすべて無効にする意図で、数値入力でformnovalidate属性を使用しようとすることができます。
<input type="number" formnovalidate />
<input type="number" pattern="[0-9]+([,\.][0-9]+)?"
name="my-num" formnovalidate
title="The number input must start with a number and use either comma or a dot as a decimal character."/>
小数点の区切りにカンマを使用するかピリオドを使用するかは、ブラウザ次第です。ブラウザは、オペレーティングシステムまたはブラウザのロケールに基づいて決定するか、一部のブラウザはWebサイトからヒントを取得します。 ブラウザ比較チャート を作成し、さまざまなブラウザがさまざまなローカライズ方法をサポートする方法を示しています。 Safariは、カンマとピリオドを互換的に処理する唯一のブラウザです。
基本的に、Web作成者としてのあなたはこれを実際に制御することはできません。いくつかの回避策には、整数を持つ2つの入力フィールドを使用することが含まれます。これにより、すべてのユーザーが期待どおりにデータを入力できます。特にセクシーではありませんが、すべてのユーザーのあらゆるケースで機能します。
.val()
の代わりに valueAsNumber
を使用します。
入力valueAsNumber [= value]
該当する場合、フォームコントロールの値を表す数値を返します。それ以外の場合は、nullを返します。
設定して、値を変更できます。
コントロールが日付ベースでも時間ベースでも数値でもない場合、INVALID_STATE_ERR例外をスローします。
完全な解決策は見つかりませんでしたが、できることはtype = "tel"を使用してhtml5検証(formnovalidate)を無効にすることでした。
<input name="txtTest" type="tel" value="1,200.00" formnovalidate="formnovalidate" />
ユーザーがコンマを入力すると、私が試したすべての最新ブラウザー(最新のFF、IE、Edge、オペラ、クローム、サファリデスクトップ、Androidクローム)でコンマとともに出力されます。
主な問題は次のとおりです。
私のユースケースでは、次のことだけが必要でした。
同様の要件がある場合は、これでうまくいくはずです。
注:パターン属性のサポートが気に入らなかった。 formnovalidateは、はるかにうまく機能するようです。
$("#my_input").val();
を呼び出すと、文字列変数として返されます。したがって、変換にはparseFloat
およびparseInt
を使用します。 parseFloat
を使用すると、デスクトップまたは電話自体は変数の意味を理解します。
さらに、次のように桁数の引数を持つtoFixed
を使用して、floatを文字列に変換できます。
var i = 0.011;
var ss = i.toFixed(2); //It returns 0.01
テキストタイプを使用しますが、数字キーボードの外観を強制します
<input value="12,4" type="text" inputmode="numeric" pattern="[-+]?[0-9]*[.,]?[0-9]+">
inputmodeタグが解決策です
数値入力にtoLocaleString()を使用したいようです。
その使用法については、 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString を参照してください。
JSでの数値のローカライズについても Internationalization(Number format "num.toLocaleString()")chromeで機能しない
私の推薦ですか? jQueryをまったく使用しないでください。私はあなたと同じ問題を抱えていました。 $('#my_input').val()
は常に奇妙な結果を返すことがわかりました。
document.getElementById('my_input').valueAsNumber
の代わりに$("#my_input").val();
を使用してから、Number(your_value_retrieved)
を使用してNumberを作成してみてください。値がNaNの場合、数値ではないことは確かにわかります。
追加することの1つは、入力に数字を書き込むとき、入力は実際にほぼすべての文字(ユーロ記号、ドル、および他のすべての特殊文字を書き込むことができます)を受け入れるため、次を使用して値を取得することをお勧めしますjQueryを使用する代わりに.valueAsNumber
。
ああ、ところで、ユーザーは国際化を追加できます(つまり、10進数を作成するためにドットではなくコンマをサポートします)。 Number()
オブジェクトに何かを作成させるだけで、いわば10進安全です。