数値から後続の重要でないゼロを削除する標準のAPI呼び出しを見逃しましたか?
例
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed()とNumber.toPrecision()は、私が探しているものではありません。
parseFloat(n)
ますか?
数値から後続の重要でないゼロを削除する標準のAPI呼び出しを見逃しましたか?
例
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed()とNumber.toPrecision()は、私が探しているものではありません。
parseFloat(n)
ますか?
回答:
文字列に変換した場合、後続のゼロは表示されません。これは、文字列ではなく数値として作成されたため、そもそも変数に格納されていません。
var n = 1.245000
var noZeroes = n.toString() // "1.245"
var n = 1.245000000000001
(ユーザに提示することが軽微であると仮定)
私が使用したかったのと同じようなインスタンスがありました .toFixed()
必要に応じありましたが、そうでないときにパディングはしたくありませんでした。そのため、toFixedと組み合わせてparseFloatを使用することになりました。
パディングなしで修正
parseFloat(n.toFixed(4));
ほぼ同じことを行う別のオプション
この回答はあなたの決定を助けるかもしれません
Number(n.toFixed(4));
toFixed
数値を特定の長さに丸める/埋め込むだけでなく、文字列に変換します。これを数値型に変換すると、数値を算術的に使用するのがより安全になるだけでなく、後続の0も自動的に削除されます。例えば:
var n = "1.234000";
n = parseFloat(n);
// n is 1.234 and in number form
なぜなら、末尾にゼロがある数値を定義しても、それらは削除されるからです。
var n = 1.23000;
// n == 1.23;
parseFloat(n).toFixed(4);
あなたの実際の答えの代わりに見ました。申し訳ありません。
+(n.toFixed(4))
?
私は最初にmatti-lyraとgaryの回答の組み合わせを使用しました:
r=(+n).toFixed(4).replace(/\.0+$/,'')
結果:
やや問題のあるケースは0.10001です。私はこの長いバージョンを使用してしまいました:
r = (+n).toFixed(4);
if (r.match(/\./)) {
r = r.replace(/\.?0+$/, '');
}
更新:これはGaryの新しいバージョンです(コメントを参照):
r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1')
これにより、上記と同じ結果が得られます。
toFixed(4).replace(/([0-9]+(\.[1-9]+)?)(\.?0+$)/,"$1")
([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)
replace(/[,.][1-9]+(0+)/,'')
ですか?
toFixed
必要であれば、この方法は適切な丸めを行います。また、後続ゼロが追加されますが、これは常に理想的ではありません。
(4.55555).toFixed(2);
//-> "4.56"
(4).toFixed(2);
//-> "4.00"
戻り値を数値にキャストすると、後続のゼロは削除されます。これは、独自の丸めや切り捨ての計算を行うよりも簡単な方法です。
+(4.55555).toFixed(2);
//-> 4.56
+(4).toFixed(2);
//-> 4
toFixed
呼び出しによって重要にしました)。奇妙なUXエッジケースです。
基本的に同じ要件があり、この機能には組み込みのメカニズムがないことがわかりました。
末尾のゼロを削除することに加えて、ユーザーの現在のロケール(つまり123,456.789)の出力を四捨五入してフォーマットする必要もありました。
これに関する私のすべての作業は、GitHubのprettyFloat.js(MITライセンス)として含まれています:https : //github.com/dperish/prettyFloat.js
使用例:
prettyFloat(1.111001, 3) // "1.111"
prettyFloat(1.111001, 4) // "1.111"
prettyFloat(1.1111001, 5) // "1.1111"
prettyFloat(1234.5678, 2) // "1234.57"
prettyFloat(1234.5678, 2, true) // "1,234.57" (en-us)
更新-2018年8月
最新のすべてのブラウザーがECMAScript国際化APIをサポートするようになりました。これにより、言語に依存する文字列の比較、数値のフォーマット、日付と時刻のフォーマットが提供されます。
let formatters = {
default: new Intl.NumberFormat(),
currency: new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
whole: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
oneDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 1, maximumFractionDigits: 1 }),
twoDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2 })
};
formatters.twoDecimal.format(1234.5678); // result: "1,234.57"
formatters.currency.format(28761232.291); // result: "$28,761,232"
古いブラウザでは、このポリフィルを使用できます:https ://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en
純粋な正規表現の答え
n.replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');
なんで誰もくれなかったのかしら!
DjangoがテキストフィールドにDecimal型の値を表示していたときにも、この問題を解決する必要がありました。たとえば、「1」が値だった場合。「1.00000000」と表示されます。「1.23」が値の場合、「1.23000000」と表示されます(「decimal_places」設定が8の場合)。
parseFloatを使用することは、まったく同じ値を返さない可能性があるため、私にとっては選択肢ではありませんでした。何も丸めたくなかったため、toFixedはオプションではなかったため、関数を作成しました。
function removeTrailingZeros(value) {
value = value.toString();
# if not containing a dot, we do not need to do anything
if (value.indexOf('.') === -1) {
return value;
}
# as long as the last character is a 0 or a dot, remove it
while((value.slice(-1) === '0' || value.slice(-1) === '.') && value.indexOf('.') !== -1) {
value = value.substr(0, value.length - 1);
}
return value;
}
これらの解決策のどれも、非常に少数の場合、私にとってうまくいきませんでした。 http://numeraljs.com/がこれを解決してくれました。
parseFloat(0.00000001.toFixed(8));
// 1e-8
numeral(0.00000001).format('0[.][00000000]');
// "0.00000001"
何らかの理由(関連するmoney-floatsなど)でFloatを使用できず、すでに正しい数を表す文字列から始まっている場合は、このソリューションが便利です。数値を表す文字列を、後続ゼロなしの数値を表す文字列に変換します。
function removeTrailingZeroes( strAmount ) {
// remove all trailing zeroes in the decimal part
var strDecSepCd = '.'; // decimal separator
var iDSPosition = strAmount.indexOf( strDecSepCd ); // decimal separator positions
if ( iDSPosition !== -1 ) {
var strDecPart = strAmount.substr( iDSPosition ); // including the decimal separator
var i = strDecPart.length - 1;
for ( ; i >= 0 ; i-- ) {
if ( strDecPart.charAt(i) !== '0') {
break;
}
}
if ( i=== 0 ) {
return strAmount.substring(0, iDSPosition);
} else {
// return INTPART and DS + DECPART including the rightmost significant number
return strAmount.substring(0, iDSPosition) + strDecPart.substring(0,i + 1);
}
}
return strAmount;
}
答えとコメントをすべて読んだ後、私はこれで終わりました:
function isFloat(n) {
let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n)) : n;
return number;
}
使用eval
することはどういうわけか害を及ぼす可能性があることは知っていますが、これは私を大いに助けました。
そう:
isFloat(1.234000); // = 1.234;
isFloat(1.234001); // = 1.234001
isFloat(1.2340010000); // = 1.234001
小数点以下の桁数を制限する場合はtoFixed()
、他の人が指摘したように使用します。
let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n).toFixed(3)) : n;
それでおしまい。
後続のゼロを削除する必要がありましたが、ゼロを含めて少なくとも2つの小数点を保持しました。
私が扱っている数値は、.toFixed(6)によって生成された6つの10進数文字列です。
期待される結果:
var numstra = 12345.000010 // should return 12345.00001
var numstrb = 12345.100000 // should return 12345.10
var numstrc = 12345.000000 // should return 12345.00
var numstrd = 12345.123000 // should return 12345.123
解決:
var numstr = 12345.100000
while (numstr[numstr.length-1] === "0") {
numstr = numstr.slice(0, -1)
if (numstr[numstr.length-1] !== "0") {break;}
if (numstr[numstr.length-3] === ".") {break;}
}
console.log(numstr) // 12345.10
論理:
文字列の最後の文字がゼロの場合、ループ関数を実行します。
最後の文字を削除して、文字列変数を更新します。
更新された文字列の最後の文字がゼロでない場合、ループを終了します。
最後から3番目の文字の更新された文字列が浮動小数点の場合、ループを終了します。
これが可能な解決策です:
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
eval(x) --> 1.234
eval(y) --> 1.234001
parseFloat()
はるかに適切です。
1.234000 === 1.234
。