web-dev-qa-db-ja.com

500000が必要なときにjavascript parseFloat '500,000'が500を返す

これをどのように処理するのが良いでしょうか?

私はすでにコンマを削除してからフロートするように解析することを考えました。

あなたはより良い/よりきれいな方法を知っていますか?

ありがとう

37
DanC

いいえ。カンマを削除します。

14
Matchu
parseFloat( theString.replace(/,/g,'') );
79
James

なぜ誰もこの表現を提案しなかったのか分かりません。

parseFloat( theString.replace(/[^\d\.]/g,'') );

ピリオドを除くすべての非数値文字を削除します。これにはカスタム関数/ループも必要ありません。それはやり過ぎです。

15
micah

文字列置換メソッドを使用できますが、正規表現で許可されている1つのライナーでは使用できません。

while(str.indexOf(',')!=-1)str= str.replace(',','');
parseFloat(str);

または、正規表現なしで単一の式を作成するには=

return parseFloat(str.split(',').join(''));

正規表現を使用します。

6
kennebec

コメントを追加するのに十分な評判はありませんが、正規表現と分割/結合のパフォーマンスを疑問に思う方のために、簡単なフィドルを示します。 https://jsfiddle.net/uh3mmgru/

var test = "1,123,214.19";

var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
    var a = parseFloat(test.replace(/,/g,''));
}
var t1 = performance.now();
document.write('Regex took: ' + (t1 - t0) + ' ms');
document.write('<br>')

var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
    var b = parseFloat(test.split(',').join(''));
}
var t1 = performance.now();
document.write('Split/join took: ' + (t1 - t0) + ' ms');

私が得る結果は次のとおりです(それぞれ100万ループに対して):

正規表現:263.335ミリ秒
分割/結合:1035.875ミリ秒

ですから、このシナリオでは、正規表現が方法であると言っても安全だと思います

2
Mogzol

一般的な問題のほとんどを解決する単純な関数はどうですか?

function getValue(obj) {
  Value = parseFloat( $(obj).val().replace(/,/g,'') ).toFixed(2);
  return +Value;
}

上記の関数は、入力された値が数値であると想定して(jQueryを使用して)フィールドから値を取得します(ユーザーがデータを入力しているときにフィールドを検証するので、フィールドの内容が数値であることを確認しています)。

浮動小数点値の場合、フィールドで適切にフォーマットされていれば、関数は浮動小数点値を正しく返します。

この関数は完全とはほど遠いですが、1,234.56または1,234,567として入力された値の ""(comma)の問題をすばやく修正します。内容が数値である限り、有効な数値を返します。

変数の前にある+plus)記号Valuereturnコマンドは、JavaScriptで使用される「dirty trick」であり、返される変数の内容がnumericになることを保証します。

たとえば、関数を他の目的に変更するのは簡単です。たとえば、「 "(コンマ)の問題に対処して、文字列を数値に変換します。

function parseValue(str) {
  Value = parseFloat( str.replace(/,/g,'') ).toFixed(2);
  return +Value;
}

両方の操作を1つの機能にまとめることもできます。つまり:

function parseNumber(item,isField=false) {
  Value = (isField) ? parseFloat( $(item).val().replace(/,/g,'') ).toFixed(2) : parseFloat( item.replace(/,/g,'') ).toFixed(2)
  return +Value;
}

そのような場合、関数が呼び出されるとresult = parseNumber('12、092.98 ');は、文字列であるため値を解析します。ただし、result = parseNumber( '#MyField'、true);と呼ばれる場合、'#MyField'から値を取得しようとします。

前に述べたように、そのような機能は完全にはほど遠く、さまざまな方法で拡張できます。 1つのアイデアは、指定されたパラメーター(文字列)の最初の文字をチェックし、解析する値を取得する場所を文字列形式に基づいて決定することです(最初の文字が= '#'の場合、それはDOMオブジェクトからのID。それ以外の場合、数値で始まる場合は、stringを解析する必要があります。

試してみてください...ハッピーコーディング。

0
Julio Marchi

@kennebecからのアイデアに基づいて、コンマが正しいことを確認したい場合、およびコンマを置き換えたくない場合は、次のようなことを試すことができます。

function myParse(num) {
  var n2 = num.split(",")
  out = 0
  for(var i = 0; i < n2.length; i++) {
    out *= 1000;
    out += parseFloat(n2[i])
  }
  return out
}
alert(myParse("1,432,85"));
// Returns 1432085, as the comma is misplaced.

それほど速くはないかもしれませんが、代替手段が必要でした:)

0
bradlis7