iOS 6 の Mobile Safari ブラウザーでのみ再現される、非常に非常に奇妙な JS の問題に遭遇しました。問題は、数値を 2 桁に減らして通貨を追加することにより、特定の値を価格にフォーマットする関数にあります。番号の前。ここに関数があります。バグの再現方法については後述します。
formatCurrency = function(value, currency, fixedPrecision, colourize, blankIfZero) {
var text;
if (blankIfZero && (Math.abs(value) < 0.01 || value === undefined)) {
return "";
}
if (fixedPrecision) {
text = currency + Math.abs(value).toFixed(2);
} else {
text = currency + roundTo2Decimals(Math.abs(value));
}
if (value < 0) {
text = "-" + text;
}
if (colourize) {
var colorClass = (value < 0 ? "negative" : "positive");
text = "<span class='" + colorClass + "'>" + text + "</span>";
}
return text;
};
roundTo2Decimals = function(value) {
var sign = value < 0 ? -1 : 1;
return Math.round(Math.abs(value) * 100.0)/100.0 * sign;
};
formatCurrency 関数を同じ値 (たとえば、setInterval 内) で何度も実行すると (たとえば、value=1; と currency="GBP")、800 ~ 1000 回の反復ごとに値が返されることに気付くでしょう。関数には負の金額が含まれています: GBP1 ではなく GBP-1。この問題は非常に厄介です。JS 関数内で問題は見つかりませんでした。
私はなんとか問題を修正しました...しかし、この実装の問題は何なのか知りたいです。[編集: 「roundTo2Decimals(Math.abs(value))」から「-」文字を削除して問題を修正しました。しかし、「-」文字はそもそも表示されるべきではありません。したがって、修正は実際には回避策でした。]
何か不足していますか?