2

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))」から「-」文字を削除して問題を修正しました。しかし、「-」文字はそもそも表示されるべきではありません。したがって、修正は実際には回避策でした。]

何か不足していますか?

4

1 に答える 1

-1

私は推測する;

text = "-" + 文字列(テキスト);

が問題です。

私も Safari の iOS6 関連のバグを探し回っています。JS をスムーズに実行するには、JS をもっときれいにする必要があるようです。

于 2012-10-16T05:06:44.280 に答える