JavaScript で表示する前に、生のデータを送信してフォーマットすることができます。デモを見る:
var MACRO_SCALE = ["", "k", "M", "G", "T"];
var MICRO_SCALE = ["", "d", "c", "m", "µ"];
function formatNumber(n) {
if (n >= 1) {
n = Math.floor(n);
var i = 0;
while (n > 100 && i < MACRO_SCALE.length - 1) {
n /= 1000;
i++;
}
n = Math.round(n) + MACRO_SCALE[i];
} else {
var r = /(\d*)\.([0]*\d{1}?)/.exec(n);
if (r) {
n = r[1] + "." + r[2];
}
var i = 0;
while (n < 1 && i < MICRO_SCALE.length - 1) {
n *= 1000;
i++;
}
n = n + MICRO_SCALE[i];
}
return n;
};
そうすることの利点は、生データを再変換する代わりに (必要に応じて) 操作できることです。結局のところ、データはデータであり、データ転送で数バイトを節約することを本当に気にしない限り、表示用にのみフォーマットする必要があります:)
**編集**
MICRO_SCALE
関数を更新して、値をよりスマートにフォーマットできるようにしました(フォーマットが正確ではなかったと思います)。それは愚かな証拠ではありませんが、十分に近いはずです。更新されたjsfiddleを参照してください。
// will not likely to go that high/low, but provided anyway
var MACRO_SCALE = ["", "k", "M", "G", "T" /*, "P", "E", "Z", "Y"*/];
var MICRO_SCALE = ["", "d", "c", "m", "µ" /*, "n", "p", "f", "a"*/];
function formatNumber(n) {
var r = /(\d*)(\.([0]*\d{1}?).*?(e-(\d+))?)?$/.exec(n);
if (r) {
var i = 0;
var scale;
//console.log(r);
if (r[4]) {
scale = MICRO_SCALE;
i = Math.abs(r[5]);
n = r[1];
while (i >= scale.length) {
n /= 10; i--;
}
} else if (r[1] >= 1) {
n = r[1];
scale = MACRO_SCALE;
while (n > 100 && i < scale.length - 1) {
n /= 1000; i++;
}
} else {
n = parseFloat("0." + r[3]);
scale = MICRO_SCALE;
while (n < 1 && i < scale.length - 1) {
n *= 10; i++;
}
}
n += scale[i];
} else {
n = 0;
}
return n;
};
これらの値と結果でテスト済み
0.00208239 ==> 2m
1000.77 ==> 1k
abc ==> 0
0.000000342 (or 3.42e-7) ==> 0.003µ
0.0000234 ==> 0.2µ
1 ==> 1
1.2 ==> 1
注.2µ
:の代わりに取得したい場合は、jsfiddle の340.2µ
行目( ) を次のように置き換えます。n += scale[i];
n = (n < 1 && n > 0 ? (""+n).substring(1) : n) + scale[i];