0

奇妙なことに、これに関する答えが見つかりません(おそらく正しく検索されていません)。

ゼロ以外の数値の最初のインスタンスの後にあるすべての数値を削除したいと考えています。

たとえば、私が持っている場合、どうすればそれを0.00208239に減らすことができますか? このデータは MySQL から取得されますが、PHP AJAX を介して id の div にルーティングされます。0.0022m

最初の有効桁数は、10^-6 から 10^6 までの任意の値です。だから、1,000.77必要があります1,000、またはあなたが素晴らしいなら、1k.

私はjQueryでそれをランプしているので、js、jQuery、MySQL、PHPのベストアンサーがチェックされますが、もちろん有効なソリューションは+.

よろしくお願いします!

4

2 に答える 2

3

正規表現を使用して最初の番号を取得し、ルックアップ テーブルを使用してサフィックスを追加できます。

$suffixes = array( 
    -6 => 'µ',
    -5 => '',
    -4 => '',
    -3 => 'm',
    -2 => 'c',
    -1 => '',
     0 => '',
     1 => '',
     2 => '',
     3 => 'k',
     4 => '',
     5 => '',
     6 => 'M',
);

preg_match( '/^[^1-9]*([1-9])/', $str, $matches);
$ten = floor( log( $str, 10));
echo $matches[1] . $suffixes[ $ten ] . "\n";
于 2013-01-27T03:07:57.073 に答える
1

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];
于 2013-01-27T03:43:37.490 に答える