web-dev-qa-db-ja.com

JavaScriptで小数点またはカンマを小数点として使用して文字列を数値に変換する

入力要素には数字が含まれます。コンマまたはドットを小数点として使用し、スペースを使用して次のように数千をグループ化できます。

「1,2」
'110 000,23'
'100 1.23'

JavaScriptを使用してブラウザでどのように浮動小数点数に変換しますか?

jQueryおよびjQuery UIが使用されます。 Number(string)NaNを返し、parseFloat()は最初のスペースまたはコンマで停止します。

42
Andrus

最初に置換を実行します。

parseFloat(str.replace(',','.').replace(' ',''))
44
hytest

完璧なソリューション

accounting.jsは、数値、通貨、通貨のフォーマット用の小さなJavaScriptライブラリです。

参照用にこれをチェック

19
Shafiq

私はパーティーに遅れていることに気付きましたが、数字のグループ化と通貨の異なる小数点記号を適切に処理するこのソリューションが必要でした。これらのいずれも私のユースケースを完全にカバーしていないため、他の人にとって役立つかもしれない独自のソリューションを作成しました。

function parsePotentiallyGroupedFloat(stringValue) {
    stringValue = stringValue.trim();
    var result = stringValue.replace(/[^0-9]/g, '');
    if (/[,\.]\d{2}$/.test(stringValue)) {
        result = result.replace(/(\d{2})$/, '.$1');
    }
    return parseFloat(result);
}

これにより、非数字が取り除かれ、小数点(またはコンマ)の後に2桁が続くかどうかが確認され、必要に応じて小数点が挿入されます。

私がこれを通貨に特化したものであり、小数点以下の桁数がないか、正確に2桁であると想定していることに注意してください。現在のロケールの詳細がわからない限り、最初に遭遇する可能性のある小数点が小数点か数字グループ化文字(たとえば、1.5421542である可能性がある)かどうかを確認するのはかなり困難ですが、 \d{2}$を小数点以下になると予想されるものに適切に一致するものに変更することにより、これを特定のユースケースに合わせて調整するのは十分に簡単です。

16
Thor84no

すべてのスペースを空の文字列に、すべてのコンマをドットに置き換えてから解析できます。

var str = "110 000,23";
var num = parseFloat(str.replace(/\s/g, "").replace(",", "."));
console.log(num);

最初のものだけでなく、すべてのスペースに一致できるように、最初のもので正規表現を使用しました。

9
Alex Turpin

これが最適なソリューションです

http://numeraljs.com/

numeral().unformat('0.02'); = 0.02
7
stuartchaney

どうですか:

parseFloat(str.replace(' ', '').replace('.', '').replace(',', '.'));
6
lpinto.eu

他のすべてのソリューションでは、事前に形式を知る必要があります。私はすべての場合にフォーマットを検出する必要がありました(!).

function detectFloat(source) {
    let float = accounting.unformat(source);
    let posComma = source.indexOf(',');
    if (posComma > -1) {
        let posDot = source.indexOf('.');
        if (posDot > -1 && posComma > posDot) {
            let germanFloat = accounting.unformat(source, ',');
            if (Math.abs(germanFloat) > Math.abs(float)) {
                float = germanFloat;
            }
        } else {
            // source = source.replace(/,/g, '.');
            float = accounting.unformat(source, ',');
        }
    }
    return float;
}

これは、次のケースでテストされました。

        const cases = {
            "0": 0,
            "10.12": 10.12,
            "222.20": 222.20,
            "-222.20": -222.20,
            "+222,20": 222.20,
            "-222,20": -222.20,
            "-2.222,20": -2222.20,
            "-11.111,20": -11111.20,
        };

提案を歓迎します。

4
Slawa