たとえば、_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でこれを実現する簡単な/提供された方法はありますか、小数点位置を計算し、文字列の長さとの差を計算する必要がありますか?ありがとう
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
function retr_dec(num) {
return (num.split('.')[1] || []).length;
}
function retr_dec(numStr) {
var pieces = numStr.split(".");
return pieces[1].length;
}
正規表現ベースの回答がまだないため:
/\d*$/.exec(strNum)[0].length
これは整数では「失敗」しますが、問題の仕様により、それらは発生しません。
この方法で、数値の小数部分の長さを取得できます。
var value = 192.123123;
stringValue = value.toString();
length = stringValue.split('.')[1].length;
数値を文字列にし、文字列を(小数点で)2つに分割し、分割操作で返された配列の2番目の要素の長さを返し、 'length'変数に格納します。
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"
)
私は非常に小さな数字を処理する必要があったため、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>");
ここで他の2つのハイブリッドのビットが、これは私のために働いた。私のコードの外部のケースは、ここでは他の人によって処理されませんでした。ただし、科学的小数位カウンタは削除していました。私はユニで愛していただろう!
numberOfDecimalPlaces: function (number) {
var match = ('' + number).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
if (!match || match[0] == 0) {
return 0;
}
return match[0].length;
}
現在受け入れられている答えをわずかに変更します。これにより、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());
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];
}
リアム・ミドルトンの答えに基づいて、私がしたことは次のとおりです(科学表記法なし):
numberOfDecimalPlaces = (number) => {
let match = (number + "").match(/(?:\.(\d+))?$/);
if (!match || !match[1]) {
return 0;
}
return match[1].length;
};
alert(numberOfDecimalPlaces(42.21));