27

この質問に基づく:数値をわかりやすい形式に丸める方法はありますか?

課題-更新されました! (仕様から数百の略語を削除)

整数(小数なし)を短縮する文字数による最短のコード。

コードには完全なプログラムを含める必要があります。

関連する範囲はfrom 0 - 9,223,372,036,854,775,807(符号付き64ビット整数の上限)です。

省略形の小数点以下の桁数は正になります。次のように計算する必要はありません:(920535 abbreviated -1 placeこれは次のようになります0.920535M)。

数十と百の位(0-999)の数字は決して省略されるべきではありません(小数点以下の数字の省略形は57-不必要で友好的ではありません)。1+5.7dk

ゼロから半分を丸めることを忘れないでください(23.5は24に丸められます)。銀行家の丸めは冗長です。

関連する番号の略語は次のとおりです。

h = hundred (102)
k = thousand (103)
M = million (106)
G = billion (109)
T = trillion (1012)
P = quadrillion (1015)
E = quintillion (1018)

サンプル入力/出力(入力は個別の引数として渡すことができます):

最初の引数は、短縮する整数になります。2番目は小数点以下の桁数です。

12 1                  => 12 // tens and hundreds places are never rounded
1500 2                => 1.5k
1500 0                => 2k // look, ma! I round UP at .5
0 2                   => 0
1234 0                => 1k
34567 2               => 34.57k
918395 1              => 918.4k
2134124 2             => 2.13M
47475782130 2         => 47.48G
9223372036854775807 3 => 9.223E
// ect...

関連する質問からの元の回答(JavaScript、仕様に準拠していません):

function abbrNum(number, decPlaces) {
    // 2 decimal places => 100, 3 => 1000, etc
    decPlaces = Math.pow(10,decPlaces);

    // Enumerate number abbreviations
    var abbrev = [ "k", "m", "b", "t" ];

    // Go through the array backwards, so we do the largest first
    for (var i=abbrev.length-1; i>=0; i--) {

        // Convert array index to "1000", "1000000", etc
        var size = Math.pow(10,(i+1)*3);

        // If the number is bigger or equal do the abbreviation
        if(size <= number) {
             // Here, we multiply by decPlaces, round, and then divide by decPlaces.
             // This gives us nice rounding to a particular decimal place.
             number = Math.round(number*decPlaces/size)/decPlaces;

             // Add the letter for the abbreviation
             number += abbrev[i];

             // We are done... stop
             break;
        }
    }

    return number;
}
4

9 に答える 9

10

J 、616365 文字

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.)

出力:

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.) 1500 0
┌─┬─┐
│2│k│
└─┴─┘

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.) 987654321987654321 4
┌────────┬─┐
│987.6543│P│
└────────┴─┘

(出力がそのように「ボックス化」される理由は、Jがさまざまなタイプで構成されるリストをサポートしていないためです)

説明(右から左へ):

(([:<.1000^.{.),{:,{.)

,結合に使用して、新しい3要素リストを作成します(最初([:<.1000^.{.)のパラメーターのフロア<.ベース1000ログ。2番目のパラメーター、次に最初のパラメーターで結合します。^.{.{:{.

したがって、最初のビットの後、say12345 2をに変換しました1 2 12345

((j.&(1&{)":({.%&1000{:));{&' kMGTPE'@{.);式の2つの半分を1つのボックスに結合して、最終的な出力を生成するために使用します。

前半は、最後の入力数()を最初の回数である1000((j.&(1&{)":({.%&1000{:))で割ったものです。次に、入力リスト()の2番目の数値を使用して精度を設定します。%{:":1&{

後半{&' kMGTPE'@{.-これは最初の数字を使用して{、0インデックスの略語リストから適切な文字を選択()します。

于 2010-04-23T17:08:59.413 に答える
7

Python 2.x、78文字

a=input()
i=0
while a>=1e3:a/=1e3;i+=1
print"%g"%round(a,input())+" kMGTPE"[i]

このバージョン(75文字)はprintfを使用しており、余分なゼロを出力し、四捨五入のルールに従います。

a=input()
i=0
while a>=1e3:a/=1e3;i+=1
print"%%.%df"%input()%a+" kMGTPE"[i]
于 2010-04-22T18:40:12.900 に答える
5

Javascript114文字

function m(n,d){p=M.pow
d=p(10,d)
i=7
while(i)(s=p(10,i--*3))<=n&&(n=M.round(n*d/s)/d+"kMGTPE"[i])
return n}

また114-スパイダーモンキーの使用-STDINへの入力

[n,d]=readline().split(' '),x=n.length,p=Math.pow,d=p(10,d)
x-=x%3
print(Math.round(n*d/p(10,x))/d+" kMGTPE"[x/3])

104-機能

function(a,b,c,d){
    c=(''+a).length;
    d=Math.pow;
    b=d(10,b);
    return((a*b/d(10,c-=c%3))+.5|0)/b+' kMGTPE'[c/3]
}

を置き換えて文字列のみを渡すことを約束すると、(''+a)これも99になります:)a

于 2010-04-22T19:20:51.240 に答える
5

Perl114111104文字_ _

私の最初のコードゴルフエントリー!

標準入力から提供される引数:perl fna.pl 918395 1

($n,$d)=@ARGV;
@n=$n=~/./g;
@s=' kMGTPE'=~/./g;
printf"%.".(@n>3?$d:0)."f%s",$n/(10**($#n-$#n%3)),$s[@n/3];

出力:

918.4k


脱ゴルフバージョン(説明付き):

( $number, $dp ) = @ARGV;      # Read in arguments from standard input

@digits = split //, $number;   # Populate array of digits, use this to count
                               # how many digits are present

@suffix = split //, ' kMGTPE'; # Generate suffix array

$number/(10**($#n-$#n%3));     # Divide number by highest multiple of 3

$precision = @n>3 ? $dp : 0;   # Determine number of decimal points to print

sprintf "%.".$precision."f%s", # "%.2f" prints to 2 dp, "%.0f" prints integer
        $number, $suffix[@n/3];# Select appropriate suffix
于 2010-04-22T22:08:46.727 に答える
4

ルビー-79777583 文字_ _

n,d=ARGV
l=n.to_s.length
printf"%.#{l>3?d:0}f%s",n.to_f/10**(l-l%3)," kMGTPE"[l/3]

コマンドライン引数から読み取ります。

74 72 80文字、二重引用符で囲まれた出力を出力します

n,d=ARGV
l=n.to_s.length
p"%.#{l>3?d:0}f%s"%[n.to_f/10**(l-l%3)," kMGTPE"[l/3]]

66 74文字、余分なゼロを出力

n,d=ARGV
l=n.to_s.length
p"%.#{d}f%s"%[n.to_f/10**(l-l%3)," kMGTPE"[l/3]]

このソリューションとサンプルコードに基づいています。

于 2010-04-24T06:09:01.413 に答える
3

dc-75文字

A7 1:U77 2:U71 3:U84 4:U80 5:U69 6:U[3+r1-r]sJ?sddZd3~d0=Jrsp-Ar^ldk/nlp;UP

Z(桁数)を使用%3して単位を検索します。ほとんどのコードは単位文字配列を設定するためのものであり、実際のコードは39文字です。マクロは、が等しいJときに調整され、7番目の印刷を回避します。テストケース。正しく丸められません。%300.918M

あなたが話すならばdc、それを自由に改善してください。

于 2010-04-23T18:23:05.843 に答える
1

PHP57文字

for($a=num+1;$a>=1;$a=$a/26)$c=chr(--$a%26+65).$c;echo$c;
于 2011-01-19T09:03:34.137 に答える
1

Haskell、126(インポートなし、2つの引数を取る関数です):

f n p|l>3=showFFloat (Just p) (c n/c 10^(l-w)) [" kMGTPE"!!f]|True=show n where(f,w)=divMod l 3;c=fromIntegral;l=length$show n

拡張:

import Numeric

doit :: Integer -> Int -> String
doit n p
    | l > 3 = showFFloat (Just p) d [" kMGTPE" !! f]
    | otherwise = show n
    where
    d = (fromIntegral n) / fromIntegral (10^(l-w))
    (f,w) = divMod l 3
    l = length $ show n
于 2012-10-11T18:35:52.527 に答える
0

Perl94文字

($_,$d)=@ARGV;$l=length;@u=' kMGTPE'=~/./g;printf"%.".($l>3?$d:0)."f$u[$l/3]",$_/10**($l-$l%3)

使用法:

perl abbreviator.pl 47475782130 2

出力:

47.48G
于 2010-07-02T12:37:11.073 に答える