web-dev-qa-db-ja.com

Javascript:* string *数値の小数の数を取得する方法は?

たとえば、_23.456_、_9.450_、_123.01_...などの小数を持つ文字列のセットがあります。少なくとも1つの10進数。

つまり、retr_dec()メソッドは次を返す必要があります。

_retr_dec("23.456") -> 3
retr_dec("9.450")  -> 3
retr_dec("123.01") -> 2
_

この場合、末尾のゼロは10進数としてカウントされます。これは 関連する質問 とは異なります。

Javascriptでこれを実現する簡単な/提供された方法はありますか、小数点位置を計算し、文字列の長さとの差を計算する必要がありますか?ありがとう

56
function decimalPlaces(num) {
  var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
  if (!match) { return 0; }
  return Math.max(
       0,
       // Number of digits right of decimal point.
       (match[1] ? match[1].length : 0)
       // Adjust for scientific notation.
       - (match[2] ? +match[2] : 0));
}

余分な複雑さは、科学表記法を処理することです

decimalPlaces('.05')
2
decimalPlaces('.5')
1
decimalPlaces('1')
0
decimalPlaces('25e-100')
100
decimalPlaces('2.5e-99')
100
decimalPlaces('.5e1')
0
decimalPlaces('.25e1')
1
108
Mike Samuel
function retr_dec(num) {
  return (num.split('.')[1] || []).length;
}
57
Jack
function retr_dec(numStr) {
    var pieces = numStr.split(".");
    return pieces[1].length;
}
11
Daniel Bidulock

正規表現ベースの回答がまだないため:

/\d*$/.exec(strNum)[0].length

これは整数では「失敗」しますが、問題の仕様により、それらは発生しません。

4
Phrogz

この方法で、数値の小数部分の長さを取得できます。

var value = 192.123123;
stringValue = value.toString();
length = stringValue.split('.')[1].length;

数値を文字列にし、文字列を(小数点で)2つに分割し、分割操作で返された配列の2番目の要素の長さを返し、 'length'変数に格納します。

3
Kamlesh Kumar

String.prototype.match()RegExp/\..*/とともに使用してみて、一致した文字列の.lengthを返します-1

function retr_decs(args) {
  return /\./.test(args) && args.match(/\..*/)[0].length - 1 || "no decimal found"
}

console.log(
  retr_decs("23.456") // 3
  , retr_decs("9.450") // 3
  , retr_decs("123.01") // 2
  , retr_decs("123") // "no decimal found"
)
2
guest271314

私は非常に小さな数字を処理する必要があったため、1e-7のような数字を処理できるバージョンを作成しました。

Number.prototype.getPrecision = function() {
  var v = this.valueOf();
  if (Math.floor(v) === v) return 0;
  var str = this.toString();
  var ep = str.split("e-");
  if (ep.length > 1) {
    var np = Number(ep[0]);
    return np.getPrecision() + Number(ep[1]);
  }
  var dp = str.split(".");
  if (dp.length > 1) {
    return dp[1].length;
  }
  return 0;
}
document.write("NaN => " + Number("NaN").getPrecision() + "<br>");
document.write("void => " + Number("").getPrecision() + "<br>");
document.write("12.1234 => " + Number("12.1234").getPrecision() + "<br>");
document.write("1212 => " + Number("1212").getPrecision() + "<br>");
document.write("0.0000001 => " + Number("0.0000001").getPrecision() + "<br>");
document.write("1.12e-23 => " + Number("1.12e-23").getPrecision() + "<br>");
document.write("1.12e8 => " + Number("1.12e8").getPrecision() + "<br>");
1
Orden

ここで他の2つのハイブリッドのビットが、これは私のために働いた。私のコードの外部のケースは、ここでは他の人によって処理されませんでした。ただし、科学的小数位カウンタは削除していました。私はユニで愛していただろう!

numberOfDecimalPlaces: function (number) {
    var match = ('' + number).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
    if (!match || match[0] == 0) {
        return 0;
    }
     return match[0].length;
}
1
Liam Middleton

現在受け入れられている答えをわずかに変更します。これにより、Numberプロトタイプが追加され、すべての数値変数がこのメソッドを実行できるようになります。

if (!Number.prototype.getDecimals) {
    Number.prototype.getDecimals = function() {
        var num = this,
            match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
        if (!match)
            return 0;
        return Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0));
    }
}

次のように使用できます。

// Get a number's decimals.
var number = 1.235256;
console.debug(number + " has " + number.getDecimals() + " decimal places.");

// Get a number string's decimals.
var number = "634.2384023";
console.debug(number + " has " + parseFloat(number).getDecimals() + " decimal places.");

既存のコードを利用して、2番目のケースをStringプロトタイプに簡単に追加することもできます。

if (!String.prototype.getDecimals) {
    String.prototype.getDecimals = function() {
        return parseFloat(this).getDecimals();
    }
}

次のように使用します:

console.debug("45.2342".getDecimals());
1
Gabriel Nahmias
function decimalPlaces(n) {
  if (n === NaN || n === Infinity)
    return 0;
  n = ('' + n).split('.');
  if (n.length == 1) {
    if (Boolean(n[0].match(/e/g)))
      return ~~(n[0].split('e-'))[1];
    return 0;

  }
  n = n[1].split('e-');
  return n[0].length + ~~n[1];

}
0
dke

リアム・ミドルトンの答えに基づいて、私がしたことは次のとおりです(科学表記法なし):

numberOfDecimalPlaces = (number) => {
            let match = (number + "").match(/(?:\.(\d+))?$/);
            if (!match || !match[1]) {
                return 0;
            }

            return match[1].length;
        };
        
alert(numberOfDecimalPlaces(42.21));
0
Fl4v